ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

qemu-system-x86_64 -m 4096M

2026/8/16 9:05:55 拓冰建站 浏览量
qemu-system-x86_64 -m 4096M 通过qemu-system-x86_64 -m 4096M指定的内存大小最终会进入客户机内核的e820_table中。这是因为 QEMU 在模拟固件时会主动创建一张 E820 内存映射表并将你指定的内存作为一个E820_RAM类型的条目添加到这张表中。QEMU如何生成包含内存的 E820 表当启动 QEMU 时它内部会执行一个构建 E820 表的过程。这个过程的核心逻辑在 QEMU 源码的e820_memory_layout.c文件中。关键的函数是e820_add_entry()。在 QEMU 的启动过程中它会为虚拟机内存布局中的每个区域调用这个函数添加对应的条目。通过-m参数指定的 4GB 内存就是其中最重要的一个区域。QEMU 会调用类似下面的逻辑将这块内存添加为一个E820_RAM条目// 这是 QEMU 内部处理逻辑的示意 e820_add_entry(address_of_your_ram, 4096 * 1024 * 1024, E820_RAM);QEMU与Seabios/EDK2的协作通过fw_cfg传递QEMU 生成这张表后还需要把它传递给客户机。在现代 QEMU 中这个传递是通过fw_cfgFirmware Configuration接口完成的。具体的流程是QEMU 构建表QEMU 在初始化内存时会将指定的 4GB 内存以及 BIOS 保留区域等信息都通过e820_add_entry()收集起来构建出一张完整的 E820 表。注册为fw_cfg文件在启动的后期QEMU 会调用fw_cfg_add_e820()函数将刚刚构建好的 E820 表作为一个名为etc/e820的文件添加到fw_cfg设备中。这正是看到的 QEMU 源码补丁所做的改进它确保所有内存区域都添加完毕后再统一将完整表提供给客户机。客户机固件如 SeaBIOS读取虚拟机内的固件SeaBIOS 或 EDK2在启动时会通过fw_cfg接口读取这个etc/e820文件。SeaBIOS 固件会优先使用这个来自 QEMU 的动态 E820 表而不是老旧的 CMOS 方式来探测内存布局。填充struct boot_params最后固件会将自己从 QEMU 获取的 E820 表按照 Linux 内核的启动协议填充到内核启动参数结构体struct boot_params的e820_table字段中并将此结构体的指针通过%rsi寄存器传递给内核。在客户机Linux内核中验证当 Linux 内核启动后可以通过以下命令查看 QEMU 传递过来的内存信息# 查看内核解析E820表后的内存布局 cat /proc/iomem在输出中应当能看到一大块标记为 System RAM 的区域其总大小应和你指定的 4GB 相符。这条信息链证实了-m 4096M→ QEMU E820表 → fw_cfg → SeaBIOS/EDK2 → Linux内核的e820_table。