该博文参考国嵌视频和http://www.cnblogs.com/image-eye/archive/2011/07/13/2105765.html,在此感谢作者。
一、地址类型
物理地址:CPU通过地址总线的寻址,找到真实的物理内存对应地址。
逻辑地址:程序代码经过编译后出现在 汇编程序中地址。
线性地址(虚拟地址):在32位CPU架构下,可以表示4G的地址空间,用16进制表示就是0x00000000---0Xffff ffff
他们之间关系?
二、段式管理、页式管理
2.1段式管理
2.2.1段式管理(16位CPU)
16位CPU内部拥有20位的地址线,它的寻址范围2^20即1M的内存空间,但是16位CPU用于存放地址的寄存器(IP,sp)只有16位,即只能访问64K内存空间。
如何使用16地址寄存器访问1M内存空间??
为了能够访问1M的内存空间,CPU采用内存分段的管理模式,并在CPU内部加入了段寄存器。16位CPU将1M内存空间分为若干逻辑段,每个逻辑段的要求如下:
1、 逻辑段的起始地址(段地址)必须是16倍数,即最后4个二进制必须全部为0
2、 逻辑段的最大容量为64K(why?因为16位CPU存放地址寄存器只有16位)
物理地址的形成方式:
由于段地址必须是16倍数,所以值一般形式为XXXX0H,即前16位二进制是变化的,后四位是固定的0,鉴于段地址的这种特性,可以只保存前16位二进制位来保存整个段基地址,所以每次使用时要段寄存器乘以16得到实际段地址。
逻辑地址=段基地址:偏移地址
其中:段基地址保存到段寄存器中,偏移地址保存另个寄存器中
线性地址= 段基地址*16+偏移地址
2.2.2段式管理(32位CPU)
在32位CPU两种工作方式:由实模式和保护模式组成。
1、 实模式:内存管理与 16位CPU是一致的。
2、 保护模式:(一般X86运行模式)
段基地址长达32位,每个段的最大容量可达4G,段寄存器的值时段地址的“选择器”(selecor),用该“选择器”从内存中得到一个32位的段地址,存储单元的
物理地址=该段基地址(Base)+段内偏移地址(offset)
2.2页式管理(分页管理)
概念
1、 线性地址页:从管理和效率的角度出发,线性地址被分为固定长度的组,称为页(page)。例如32位机器,线性地址最大可为4G,如果用4KB为页容量,这样将线性地址划分为2^20个页。
2、 物理页:另一类“页”,称为“物理页”,或者是“页框、页帧”。分页单元把所有的物理内存也划分为固定长度的管理单位,它的长度一般与线性地址页是相同。
如何将两者之间的映射?通过页式管理实现映射。
页式管理具体流程:
说明:
1、 分页单元中,页目录的地址放在CPU的CR3寄存器中,是进行地址转换的起始点。
2、 每个进程,都有其独立的虚拟地址空间,运行一个进程,首先需要将它的页目录地址放到CR3寄存器中,将其他进程保存下来。
3、 每一个32位的线性地址被划分三部分:页目录索引(10位):页表索引(10位):偏移(12位)
下面是地址转换的步骤:
第一步:装入进程的页目录地址(操作系统在调度进程时,把这个地址装入CR3)
第二步:根据线性地址前十位,在页目录中,找到对应的索引项 即页表地址。
第三步:根据线性地址中间十位,在页表中,找到对应的索引项 即页的起始地址。
第四步:将页的起始地址与线性地址最后12位相加,等到物理地址。
1、 这样的二级模式是否支持寻址4G的物理地址空间?为什么?
支持。因为页目录支持寻址2^10个页表,每个页表支持寻址2^10个页,每个页由2^12=4Kbyte组成,即2^10* 2^10*2^12=4Gbyte满足。
2、 由上图物理地址的页容量多大?有什么决定的?
在二级模式下,页容量由线性地址[bit11:0]决定,页容量=2^12=4Kbyte。
根据上面的分段管理和分页管理,得出下图
该图源于/www.cnblogs.com/image-eye/archive/2011/07/13/2105765.html博客
三、linux内存管理
Linux内核的设计并没有全部采用intel所提供的段机制,仅仅是有限度使用了分段机制。这不仅简化了linux内核的设计,而且为了把linux移植到其他平台创造了条件,因为很多RISC处理器并不支持段机制。
为什么是linux内核设计有限度使用分段机制?
因为linux内核中内存管理中:所有的段的基地址均为0,即每个段的逻辑地址与线性地址保持一致(即逻辑地址的偏移量值与线性线性的地址值相同),而完成利用了分页机制。
前面介绍的i386的二级页管理架构,有些CPU使用三级或四级架构。在linux2.6.29内核为每种CPU提供统一界面,四级页管理架构,来兼容二级三级 四级管理架构的CPU。四级架构详见下面:
其中:
1、页全局目录(page global directory):多级页表的抽象最高层 2、页上级目录(page upper directory):即pud
3、页中间目录( page middle directory):即pmd 页表的中间层
4、页表(page table entry):pte
5、页:即具体物理地址