### 虚拟内存初始化 为了了解虚拟内存初始化的过程和虚拟内存开启后的效果,首先需要了解在寻你内存初始化之前计算机的内存组织方式。 在刚刚完成的lab1中,我们所完成的os实际上就还不具备虚拟内存的功能,恰好符合没有开启虚拟内存的os运行状态。此时cpu在进行内存寻址时,会直接使用物理地址进行寻址,访问特殊内存地址(IO设备地址)时同样会使用固定的物理地址直接访问。os的寻址方式的示意图为:  为了开启虚拟内存,就需要使用页表将物理地址与虚拟地址建立联系,利用页表进行查找,从而实现从os需要访问的虚拟地址到硬件所支持的物理地址的转化过程。具体的转化过程依赖于硬件上MMU部件的设计,课程中也已经讲解。  虚拟内存开启后的内存寻址方式就变为下图所示:  os会经过硬件上的MMU器件进行寻址转换,实现虚拟内存的功能。
虚拟内存的功能主要由硬件上的MMU部件进行支持,os为了使用虚拟内存功能,以X86架构为例,仅需要设定页表初始地址和状态寄存器即可(cr3和cr0)
mov ecx, page_table ; 设定顶层页表起始地址
mov cr3, ecx ; 将顶层页表地址传递给cr3寄存器
mov ecx, cr0 ; 复制cr0寄存器当前状态
or ecx, 0x80000000 ; 页表使能位置1(从0起第31位)
mov cr0, ecx ; 重新设定cr0寄存器,页表功能使能
图片加载出现问题时,可见参考网址
参考网址:https://medium.com/@connorstack/how-does-an-os-enable-virtual-memory-696a8f75f274
Edit by 计74 王荻,董昊文