前言
上一篇文章,我们走马观花地介绍了bochs从启动到CPU执行流程的大体流程,里面相关数据结构没详细分析。这篇文章我们尝试来详细分析一下bochs的物理内存初始化,首先有个概念需要理清(相信来看bochs源码的人肯定会知道):bochs只负责处理物理内存,而虚拟内存是运行在bochs中运行的OS来负责的,我们只需要关注物理内存。
找到内存初始化函数
在上篇文章中,我们提到过一个比较重要的函数 bx_init_hardware(),该函数负责初始化各种硬件(内存,Iodev,CPU.....),因此物理内存的初始化就是在该函数中进行的,我们直接来看函数片段:
int bx_init_hardware()
{
......
// set up memory and CPU objects
bx_param_num_c *bxp_memsize = SIM->get_param_num(BXPN_MEM_SIZE);
Bit64u memSize = bxp_memsize->get64() * BX_CONST64(1024*1024);
bx_param_num_c *bxp_host_memsize = SIM->get_param_num(BXPN_HOST_MEM_SIZE);
Bit64u hostMemSize = bxp_host_memsize->get64() * BX_CONST64(1024*1024);
// do not allocate more host memory than needed for emulation of guest RAM
if (memSize < hostMemSize) hostMemSize = memSize;
BX_MEM(0)->init_memory(memSize, hostMemSize);
// First load the system BIOS (VGABIOS loading moved to the vga code)
BX_MEM(0)->load_ROM(SIM->get_param_string(BXPN_ROM_PATH)->getptr(),
SIM->get_param_num(BXPN_ROM_ADDRESS)->get(), 0);
....
}
memSize与hostMemSize
首先,我们这里有一个概念,memSize 与 hostMemSize,这个名字第一眼看上去特别懵逼。难道这个也有像Intel虚拟化那种guest host内存的概念?这完全不是一个层次啊,我们现在bochs是单纯模拟硬件,只应该存在物理内存啊,此时决定不去阅读代码(概念不对,阅读出来的代码从理解上也是错误的)。
然后搜了一圈,在官方文档中找到了答案,内容如下。简单来说,就是guest是虚拟机真正分配的物理内存,而host >= guest, host多出来的部分相当于内存池,支持后续guest机的动态分配内存。
4.3.6. memory
Examples:
memory: guest=512, host=256
Set the amount of physical memory you want to emulate.
guest
Set amount of guest physical memory to emulate. The default is 32MB, the maximum&nb