1 QEMU函数执行流程
machine_init(pc_machine_init) –> pc_machine_init(void) –> 注册QEMUMachine结构体变量pc_i440fx_machine_v2_3 –> pc_init_pci –> pc_init1 –> pc_memory_init –> pc_system_firmware_init –> old_pc_system_rom_init –> 检查bios文件不为空并且大小是65536的整数倍 –> memory_region_init_ram初始化一定大小的虚拟机物理内存 –> vmstate_register_ram_global –> memory_region_set_readonly –> rom_add_file_fixed将bios文件加载到虚拟机物理内存(uint32_t)(-bios_size)(物理内存最高的地方)处 –> memory_region_init_alias创建isa_bios作为bios的别名使用,但是最多映射bios的最后128Kb –> memory_region_add_subregion_overlap将isa_bios映射到ISA空间 –> memory_region_set_readonly设置ISA空间为只读 –> memory_region_add_subregion将bios映射到ROM内存的最高处。
2 seaBIOS背景知识
SeaBIOS也像正常的BIOS一样,在虚拟机上电的时候,会被加载到地址空间0xFFFFFFF0处,并且该处是一条跳转指令,虚拟机的虚拟CPU会去执行SeaBIOS的代码,完成虚拟硬件的初始化,中断服务函数的设置,ACPI表、SMBIOS表、E820表等的创建,最后引导启动OS。
SeaBIOS程序的各种