使用debugfs分析Ext2下的稀疏文件
本文将介绍 Ext2 文件系统下的稀疏文件表示,并使用 debugfs 对其进行分析。 环境准备12345678910111213141516# 创建一个 2G 大小的 Ext2 磁盘镜像文件dd if=/dev/zero of=ext2.img bs=1M count=2048# 生成一个 8M 大小的全零文件(非稀疏)dd if=/dev/zero of=8M.zero bs=1M count=8# 创建一个 8M 大小的 Ext2 格式化的镜像文件(稀疏)cp 8M.zero 8M.ext2mkfs.ext2 -F 8M.ext2# 将两个 8M 大小的文件拷入 ext2.img 中mkdir -p tmpsudo mount ext2.img tmpsudo cp 8M.zero tmpsudo cp 8M.ext2 tmpumount tmp 稀疏文件的本质稀疏文件即一个文件的起始位置到结束位置之间存在“空洞”(如下图所示),所谓空洞,就是该文件区域没有被分配任何的磁盘空间,体现在 Ext2 文件系统元数据的层面就是——对应的数据块指针为空。 更形式化的描述为:只要...
个人常用git命令整理
由于最近刚刚快速过完了一遍《Pro Git》,因此想要将个人比较常用的 git 命令整理出来,以便需要时翻看。因此本文是一个个人向的笔记,不会涉及对 git 原理的介绍,这部分的具体内容可以参考《Pro Git》。 准备阶段初始化配置12345678# 全局配置文件位置~/.gitconfig# 全局配置用户名git config --global user.name <your_name># 全局配置邮箱git config --globale user.email <your_email> 新建仓库12345# 本地初始化仓库git init <repo_name># 远程克隆仓库git clone <repo_url> 工作阶段查看日志123456789# 查看当前分支提交日志git log# 查看 HEAD 指针的变动日志git reflog# 查看当前仓库状态# 包括未跟踪文件、工作区变更、暂存区内容git status 提交文件123456789# 将工作区更新文件存入暂存区git add <file_path&...
现有机密虚拟机设计方案汇总
本文算是一个笔记性质的文章,整理了现有的大部分机密虚拟机(CVM)的设计方法,并主要围绕硬件/固件扩展、内存机密性保护、内存完整性保护、寄存器状态保护几个方面来介绍。覆盖了市面上的大多数 CVM 设计,既包括工业界已商用的方案,如 AMD SEV、Intel TDX 等,也包括一些学术界的方案,如 VirTEE、ZION。 由于 Arm 官方方案 CCA 的标准和软件栈趋近成熟,因此基于 Arm 架构的其它方案如 TwinVisor 和 virtCCA 在此便不再介绍了,以下是个人整理的现有 CVM 方案的列表: AMD SEV-SNP: 现已商用。 Intel TDX: 现已商用。 Arm: TwinVisor (SOSP ‘21): None virtCCA (arXiv): None CCA (官方方案): 硬件规范成熟,软件栈快速构建中,支持的芯片(Arm v9)还未上市。 IBM PEF: 现已商用,发表论文(EuroSys ‘21)。 RISC-V: CoVE: 社区官方方案,正在建设中 VirtTEE (DAC ‘22): 向下兼容,虚拟机内核无需经过修改。...
浅谈rootfs、initramfs和initrd
本文算是之前博客 使用QEMU安装并启动一个Ubuntu发行版 | Lordaeron_ESZ’s blog 的一个 callback,花了一天时间整理了一下有关 rootfs、initramfs 等操作系统启动相关的内容,并在此分享出来。 rootfs首先需要理解 rootfs(即根文件系统)的概念。本质上来说,rootfs 就是挂载在根目录(/ 目录)上的文件系统,而无关具体的文件系统类型。 另外,rootfs 根据系统启动时刻的不同,分为两个阶段,一阶段为系统启动初期的内存 rootfs(通常为 ramfs 和 tmpfs,下面将具体介绍),二阶段为完成基本的模块加载等操作之后的磁盘 rootfs(包括 ext4、zfs 和 btrfs 等等)。 ramfs 和 tmpfsramfs 只是一个简单的文件系统,用作一阶段 rootfs 的文件系统类型,它与磁盘文件系统最大的区别就在于 它没有可供回写的后备设备 ,以 Linux 6.12 内核版本为例(下同),其 ramfs 的代码实现: 1234567891011/* fs/ramfs/file-mmu.c */const...
论文《SoK:Understanding Designs Choices and Pitfalls of Trusted Execution Environments》总结
本文将分享发表在 AsiaCCS ’24 上的论文《SoK: Understanding Designs Choices and Pitfalls of Trusted Execution Environments》,文章系统梳理了不同可信执行环境(TEE)设计上的选择和取舍,个人读完之后很有收获,推荐想做或正在做 TEE 设计相关工作的阅读。 TEE 设计核心挑战文章提出了 TEE 设计过程中的核心挑战:TEE 设计如何保护 TEE 实例使用的资源,同时使不受信任的(宿主机)操作系统能够以有效的方式管理计算资源,以履行 CSP 的职责。 简而言之,就是如何平衡安全隔离和高效性能之间的关系。举个极端的例子,我们可以将虚拟机启动、vCPU 调度、内存分配、异常处理等不可信 hypervisor 的工作完全交给新引入的位于 TCB 中的可信实体(文中称之为 RTPM, TEE Runtime Protection Module)来完成,这样会导致一些问题:在 RTPM 中实现宿主 hypervisor 中复杂的调度策略是不现实的。首先,像 AMD SEV 它的 RTPM 为安全协处...
使用QEMU调试Linux内核
本文是一个快速记录,旨在记录使用 QEMU 调试 Linux 内核的方法,文章内容比较短,内容也比较浅显,不会对具体原理进行分析,主打一个够用。使用的 QEMU 版本为 6.2,Linux 内核版本为 5.10,指令集架构为 x86_64。 使用 monitor使用 monitor 的前提是要先启用该功能,一般将其设置在指定的 telnet 端口(如 6789): 1-monitor telnet:localhost:6789,server,nowait,nodelay 使用 monitor 调试的基本场景是内核 crash 时,打开 QEMU 的 monitor,打印此时的寄存器值。为了保证 RIP 的值准确,需要在 QEMU 模拟器的内核命令行参数中关闭内核地址空间随机化: 1-append "nokaslr" 打开新的终端使用 telnet 连接到指定端口: 123456789101112131415161718192021222324252627282930313233343536373839$ telnet localhost 6789Trying...
使用QEMU安装并启动一个Ubuntu发行版
之前自己编译 QEMU 跑模拟器/虚拟机基本都是跑的一个基于 buildroot 构建的小型根文件系统,虽然也能够完成一些基础的测试,但是功能完备性上相比发行版来说还是要差很多,而且如果想添加新的软件环境也比较麻烦。因此这两天花了点时间倒腾了一下环境,把 QEMU 安装和运行发行版的流程走通,便于后续的学习和研究。 安装系统发行版我选择的是 Ubuntu,没有什么别的原因,只是因为用的最多。而已经安装好 Ubuntu 系统的磁盘镜像可能不太好找(官网只看到 RISC-V 架构有 pre-installed 版本),因此我选择下载 iso 镜像,然后手动安装。这里可以直接选择通过清华镜像源下载: 1wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/noble/ubuntu-24.04.3-live-server-amd64.iso 我下载的是较新的版本,因此 seabios 可能不支持,需要更现代的固件,虚拟机场景下通常是 OVMF,使用包管理工具安装一下: 1sudo apt install ovmf 找到安装好...
QEMU训练营2025专业阶段实验解析
本人的研究方向主要是操作系统与虚拟化,平时接触最多的开源项目除了 Linux 内核外,便是 QEMU 了,不只是将它作为一个全系统模拟器和 VMM 来使用,还涉及到基于它的增量开发的工作。但这些基本都还是边做边学的,主要原因在于市面上一直缺乏系统性介绍 QEMU 的书籍和资料(我知道的仅有一本《QEMU/KVM 源码解析与应用》,但其主要专注于 QEMU 的 VMM 用途,对模拟器的介绍不是重点)。得知 OpenCamp 将举办 QEMU 训练营,我也是在持续关注,并且在第一时间报名并开展了学习。 截至现在,我已经完成了基础阶段和专业阶段的学习,正在等待项目阶段的开放。本文将分享我专业阶段实验的解题思路和方法,作为个人的一个记录,也为后续参与训练营的同学提供参考。 实验概述专业阶段的实验平台是由训练营主办方专门设计的一个简易的教学用板卡 G233,对它的介绍可以参考文档:b. G233 Datasheet - Learning QEMU Docs。 实验共有十个,归类下来总共有三类:lab1 主要是根据手册的说明,补全对 G233 板卡的模拟代码;lab2 ~ lab5 则是为...
Linux内核物理内存管理器的建立过程
本文将介绍 Linux 内核中物理内存管理结构的建立过程,主要分为获取物理内存布局、早期内存管理器和最终内存管理器三个阶段,本文将以 x86_64 架构为例,内核代码基于 Linux 5.10 版本来介绍。 获取物理内存布局当 x86_64 系统启动,BIOS 将控制权交给 Bootloader(如 GRUB) 之后,此时 CPU 模式还处于 实模式 下,可以进行 BIOS 中断调用,Bootloader 将会通过反复调用(每次只能获取一段内存区域的信息) int 0x15 eax=0xE820 这个中断来获取计算机的物理内存布局。 0x15 号中断还有 0xE801, 0x88 的功能号,都用于获取物理内存布局,只不过功能更简单。 存储获取到的每段内存区域信息的数据结构如下,包括起始地址、大小、类型。 123456/* arch/x86/include/uapi/asm/bootparam.h */struct boot_e820_entry { __u64 addr; __u64 size; __u32 type;} __attribute__((p...
鸿蒙内核论文阅读分享
国庆假期,无心工作,便把之前一直想读却没时间读的鸿蒙内核论文:《Microkernel Goes General: Performance and Compatibility in the HongMeng Production Microkernel》拿出来读了一读,并记录下我的一些总结和想法。虽然操作系统内核是我的主要研究方向之一,但是平时的工作接触的都是 Linux 这样的宏内核操作系统,对微内核的了解只停留在理论层面,没有具体读过 Minix、seL4 等微内核的源码,甚至也没做过上交 IPADS 团队的 ChCore 操作系统实验,因此也只是一些粗浅的想法,图一乐就好。 实现了哪些特性下图是论文中关于鸿蒙内核的架构图: 首先是同时实现了对 Linux API 和 ABI 的兼容,因此不仅能够通过编译源码的方式运行面向 Linux 开发的应用程序,对于那些不开放源代码,直接以二进制形式进行分发的应用程序,也能够基于兼容层——ABI-compliant Shim 实现运行时兼容。除此之外,还实现了一个设备驱动的兼容层——Linux Driver Container,能...










