内存虚拟存储主要是为了将一个进程分为不同页.存储到不同物理页中.然而不同进程的虚拟地址是可以相同的.因为MMU把进程的虚拟地址映射到各个不同的物理地址中.
以下操作系统采用二级分页.一开始CS:IP寄存器.将CS的基地址跟IP的偏移地址进行相加.得到线性地址.接着.线性地址的高10位用于当作页目录表的索引.页目录表保存的是页表的物理地址.接着.线性地址的低10位用于当作页表的索引.页表保存的是4k大小的页块.线性地址低10位那就是页块的偏移地址.由此虚拟地址->物理地址转换结束.当然操作系统在创建页目录表的时候.要把页目录表的物理地址给加载到cr3寄存器中.
开启分页机制分为3件事.
(1)设置页目录表跟页表
(2)把页目录表的地址加载到cr3寄存器中
(3)将寄存器的cr0的PG位置为1表示开启了分页机制
规划页目录表跟页表位置
在用户进程.高3G部分给操作系统.而0~3G是用户的空间.每个进程都有页表.然后一个用户进程的功能完成是需要内核配合的.于是所有用户进程应该共享内核.也就是等于3G-4g的所有用户进程空间指向的都是同一个物理页地址
这里我们将把页目录表放在0x100000处.页表也挨着页目录表放在0x101000处(第二个页表.当然在此之前应该把物理内存给算出来.这里可以使用bios中断来获取物理内存
%include "boot.inc"
section loader vstart=loader_base_addr
;------------全局描述符表的定义
gdt_base:
dd 0x00000000 ;全局描述表.第一个描述符要为空
dd 0x00000000
code_base:
dd 0x0000FFFF
dd desc_code_high4
data_stack_desc:
dd 0x0000ffff
dd de