现代操作系统中,都会用到分页机制
在32bit操作系统中,对于一个进程来说,他拥有4GB的内存空间
其中低2G属于进程自己的,高2G的空间属于内核空间,所有进程看到的内核空间中的值都是一样的,也就是说是共享的,但是进程并没有权限直接去访问这段内存,不同的进程也无法直接访问其他进程的低2GB内存空间(用户空间)
所有的进程看到的内存地址都是一样的,这些地址实际上都是虚拟地址,他们和物理地址有一个转换关系
这个转换关系是下面这样的:
目录:分页目录,你可以把他理解成一个表的目录,每一项都指向一个页表(我们约定这个表叫做CNMDTABLE),是一个地址,把这个地址加上cr3寄存器的值,得到页表的地址
页:用于指示我们要的是CNMDTABLE中的那一项,还是一个地址(我们用定位WCNMADDR)
偏移:用这个偏移量+WCNMADDR就可以得出物理地址了
在计算出页的时候,我们就可以判断这个页是否存在了,因为在页表中记录了页的状态,如果这个页不存在,就触发缺页中断,将页从磁盘中换到内存
12位的偏移量说明,每一个页最大可以达到4MB,但是实际上一个页是4kb
切换不同的进程时,cr3的值的不一样,这样就可以通过同样的虚拟内存地址来计算出不同的物理地址了
页表中每一项的详细结构
P用于指示这个页是否存在
W用于指示是否可写
U:1表示为用户页R3级,0表示为系统页 R0级
但是并没有指示页是否可以执行的标志位
后来的CPU架构解决了这一问题
页表项被扩展为64bit,其中NX启用则表示页不可执行