前言
上一篇文章,我们走马观花地介绍了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 amount limited only by physical address space limitations.
host
Set amount of host me