现有机密虚拟机设计方案汇总
本文算是一个笔记性质的文章,整理了现有的大部分机密虚拟机(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 的代码实现:
/* fs/ramfs/file-mmu.c */
const struct file_op ...
论文《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):
-monitor telnet:localhost:6789,server,nowait,nodelay
使用 monitor 调试的基本场景是内核 crash 时,打开 QEMU 的 monitor,打印此时的寄存器值。为了保证 RIP 的值准确,需要在 QEMU 模拟器的内核命令行参数中关闭内核地址空间随机化:
-append "nokaslr"
打开新的终端使用 telnet 连接到指定端口:
$ telnet localhost 6789
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
QEMU 6.2.0 monitor ...
使用QEMU安装并启动一个Ubuntu发行版
之前自己编译 QEMU 跑模拟器/虚拟机基本都是跑的一个基于 buildroot 构建的小型根文件系统,虽然也能够完成一些基础的测试,但是功能完备性上相比发行版来说还是要差很多,而且如果想添加新的软件环境也比较麻烦。因此这两天花了点时间倒腾了一下环境,把 QEMU 安装和运行发行版的流程走通,便于后续的学习和研究。
安装系统发行版我选择的是 Ubuntu,没有什么别的原因,只是因为用的最多。而已经安装好 Ubuntu 系统的磁盘镜像可能不太好找(官网只看到 RISC-V 架构有 pre-installed 版本),因此我选择下载 iso 镜像,然后手动安装。这里可以直接选择通过清华镜像源下载:
wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/noble/ubuntu-24.04.3-live-server-amd64.iso
我下载的是较新的版本,因此 seabios 可能不支持,需要更现代的固件,虚拟机场景下通常是 OVMF,使用包管理工具安装一下:
sudo apt install ovmf
找到安装好的 OVM ...
QEMU训练营2025专业阶段实验解析
本人的研究方向主要是操作系统与虚拟化,平时接触最多的开源项目除了 Linux 内核外,便是 QEMU 了,不只是将它作为一个全系统模拟器和 VMM 来使用,还涉及到基于它的增量开发的工作。但这些基本都还是边做边学的,主要原因在于市面上一直缺乏系统性介绍 QEMU 的书籍和资料(我知道的仅有一本《QEMU/KVM 源码解析与应用》,但其主要专注于 QEMU 的 VMM 用途,对模拟器的介绍不是重点)。得知 OpenCamp 将举办 QEMU 训练营,我也是在持续关注,并且在第一时间报名并开展了学习。
截至现在,我已经完成了基础阶段和专业阶段的学习,正在等待项目阶段的开放。本文将分享我专业阶段实验的解题思路和方法,作为个人的一个记录,也为后续参与训练营的同学提供参考。
实验概述专业阶段的实验平台是由训练营主办方专门设计的一个简易的教学用板卡 G233,对它的介绍可以参考文档:b. G233 Datasheet - Learning QEMU Docs。
实验共有十个,归类下来总共有三类:lab1 主要是根据手册的说明,补全对 G233 板卡的模拟代码;lab2 ~ lab5 则是为 RI ...
Linux内核物理内存管理器的建立过程
本文将介绍 Linux 内核中物理内存管理结构的建立过程,主要分为获取物理内存布局、早期内存管理器和最终内存管理器三个阶段,本文将以 x86_64 架构为例,内核代码基于 Linux 5.10 版本来介绍。
获取物理内存布局当 x86_64 系统启动,BIOS 将控制权交给 Bootloader(如 GRUB) 之后,此时 CPU 模式还处于 实模式 下,可以进行 BIOS 中断调用,Bootloader 将会通过反复调用(每次只能获取一段内存区域的信息) int 0x15 eax=0xE820 这个中断来获取计算机的物理内存布局。
0x15 号中断还有 0xE801, 0x88 的功能号,都用于获取物理内存布局,只不过功能更简单。
存储获取到的每段内存区域信息的数据结构如下,包括起始地址、大小、类型。
/* arch/x86/include/uapi/asm/bootparam.h */
struct boot_e820_entry {
__u64 addr;
__u64 size;
__u32 type;
} __attribute__((packe ...
鸿蒙内核论文阅读分享
国庆假期,无心工作,便把之前一直想读却没时间读的鸿蒙内核论文:《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,能够直接 ...
QEMU内存后端文件与FUSE兼容性问题及其定位
最近想要将文件系统和 QEMU 模拟器结合起来做一些实验性的工作,需要使用 QEMU 内存后端文件的特性。前面的进展都很顺利,但是待准备工作都完成后,却遇到了模拟器无法启动的问题,好在最终还是解决了,接下来便一一细说。
环境准备我的基本开发环境为 QEMU 6.2 版本,Linux 5.10 版本内核,面向架构为 x86_64。这部分环境的准备没有遇到什么大问题,只是需要注意我选用的版本相对较老,在使用较新的编译器编译时可能会报出警告,因此需要在编译前的 configure 阶段将 Werror 的 flag 禁用,以免在编译时将警告当作错误来对待。
例如对于 QEMU 来说,configure 的命令为:
$ ./configure --target-list=x86_64-softmmu --disable-docs --disable-werror
这里最好也加上 --disable-docs,因为编译文档的工具链同样容易由于版本问题导致编译失败。
文件系统方面,我当前的需求是需要实现一个最简的堆叠式加密文件系统,无需关注具体的加密算法是什么。一般来说,有两种方案:内核文件 ...
QEMU内存后端文件的用法及分析
本文将介绍 QEMU 中内存后端文件参数用法和代码实现,基于的版本为 QEMU 6.2。
参数用法首先是参数的用法,下面是 官方文档 中对此的说明:
memory-backend=’id’
An alternative to legacy -mem-path and mem-prealloc options. Allows to use a memory backend as main RAM.
For example:
-object memory-backend-file,id=pc.ram,size=512M,mem-path=/hugetlbfs,prealloc=on,share=on
-machine memory-backend=pc.ram
-m 512M
接下来我们做一个测试,首先创建一个空文件 mem,使用 du 查看其空间占用大小:
$ du -sh mem
0 mem
然后利用参数指定该文件为内存后端文件,并启动一个模拟器,启动参数如下:
qemu-system-riscv64 \
-cpu rv64 \
-object mem ...










