内存储器管理(一)硬件寻址的基本原理

内存管理(一)硬件寻址的基本原理

摘要:本文讲述8086怎样进行芯片级别的内存寻址,linux又是如何在这些硬件的基础上进行寻址的。本文主要讨论硬件和linux寻址的基本原理,后续将讨论分页机制的具体实现,内核如何给自己分配主存,怎样给进程分配线性地址。


一、寻址流程


逻辑地址经过分段单元形成线性地址,然后经过分页单元形成物理地址。


二、硬件中的分段


1.段选择符和段寄存器


2.段描述符


注明:GDT在主存中的地址和大小放在gdtr控制寄存器中,当前正在被使用的LDT地址放在ldtgr寄存器中。

关于段选择符和段描述符,可以参考:保护模式编程之(一)——分段机制与GDT/LDThttp://blog.csdn.net/trochiluses/article/details/8968750


3.分段单元


逻辑地址的转换过程如下:

内存储器管理(一)硬件寻址的基本原理


三、硬件中的分页


i386 CPU实现内存管理的基本思路是通过页目录和页表两极映射实现从线性地址到物理地址的转换。原因:4GB的线性地址空间,如果我们采用一级映射,页大小是4K,那么需要的页表项数量为4G/4K=1M;另外,一个页表项的大小是8B,如此一个进程的页表需要的存储空间位8M。实际情况下,可能线性地址空间仅仅某一部分有效(例如0x00000000~0x0000ffff),此时如果采用二级页表,可以避免一些无用线性地址的映射(如果相应的线性地址无效,那么对应的页目录项设置为空)。


其中寄存器cr3用于存放当前进程正在使用的页目录基地址。dir用于指明目录项,table用于指明表项,offset用于指明页内偏移。8086处理器分页原理如下图:

内存储器管理(一)硬件寻址的基本原理

页目录项和页表项有同样的结构;

它们都有4B共32b,具体布局如下:

内存储器管理(一)硬件寻址的基本原理


其中每个位的作用如下:

P--位0是存在(Present)标志,用于指明表项对地址转换是否有效。P=1表示有效;P=0表示无效。在页转换过程中,如果说涉及的页目录或页表的表项无效,则会导致一个异常。如果P=0,那么除表示表项无效外,其余位可供程序*使用,如图4-18b所示。例如,操作系统可以使用这些位来保存已存储在磁盘上的页面的序号。

R/W--位1是读/写(Read/Write)标志。如果等于1,表示页面可以被读、写或执行。如果为0,表示页面只读或可执行。当处理器运行在超级用户特权级(级别0、1或2)时,则R/W位不起作用。页目录项中的R/W位对其所映射的所有页面起作用。

U/S--位2是用户/超级用户(User/Supervisor)标志。如果为1,那么运行在任何特权级上的程序都可以访问该页面。如果为0,那么页面只能被运行在超级用户特权级(0、1或2)上的程序访问。页目录项中的U/S位对其所映射的所有页面起作用。

A--位5是已访问(Accessed)标志。当处理器访问页表项映射的页面时,页表表项的这个标志就会被置为1。当处理器访问页目录表项映射的任何页面时,页目录表项的这个标志就会被置为1。处理器只负责设置该标志,操作系统可通过定期地复位该标志来统计页面的使用情况。

D--位6是页面已被修改(Dirty)标志。当处理器对一个页面执行写操作时,就会设置对应页表表项的D标志。处理器并不会修改页目录项中的D标志。

AVL--该字段保留专供程序使用。处理器不会修改这几位,以后的升级处理器也不会。

PAGE SIZE只用于页目录项,如果为1表示启用大页,2M或者4M


3.2扩展 分页

从pentium开始,8086处理器引入了扩展分页模式,它允许页框大小是4M而非4K,它用于把大段连续的物理地址转换成相应的物理地址。在这种情况下,内核不使用中间页表进行地址转换,进而节省内存并保留TLB项。扩展分页机理如下:
内存储器管理(一)硬件寻址的基本原理
扩展分页的页目录项和普通分页基本相同,除了:

1)page size位必须被设置
2)20位物理地址字段只有高10位是有意义的
通过设置cr4处理器寄存器的PSE标志能使得拓展分页和常规分页共存。

3.3物理 地址扩展(PAE)分页机制

intel通过物理地址扩展机制,利用32位的线性地址可以寻址36b的物理地址空间(不是同时可访问的)。PAE的具体原理可以参考这里http://blog.csdn.net/trochiluses/article/details/12853027


3.4 64位系统中的分页

首先,32位下的分页机制不再适用。因为如果仍然是4K页,我们用48位线性地址来进行寻址,那么剩下48-12=52位,如果我们用其中的48位建立二级分页机制,那么每个进程的页目录项和页表项将含有2^18,太大了。

X86_64下,页大小是4K,寻址位数是48,分页级别是4,地址划分:9+9+9+9+12