linux内存段页,linux内存管理-段式和页式管理

该博文参考国嵌视频和http://www.cnblogs.com/image-eye/archive/2011/07/13/2105765.html,在此感谢作者。

一、地址类型

物理地址:CPU通过地址总线的寻址,找到真实的物理内存对应地址。

逻辑地址:程序代码经过编译后出现在 汇编程序中地址。

线性地址(虚拟地址):在32位CPU架构下,可以表示4G的地址空间,用16进制表示就是0x00000000---0Xffff ffff

他们之间关系?

be3f726ea5cbd0fc98e70c6332b3f846.png

二、段式管理、页式管理

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)

27e020369948ec5d4f6ca74f9ba0438b.png

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。

根据上面的分段管理和分页管理,得出下图

5e559de9e840fc2790b96785ddadf180.png

该图源于/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。四级架构详见下面:

dbac37569928116b952be809fa0f4990.png

其中:

1、页全局目录(page global directory):多级页表的抽象最高层 2、页上级目录(page upper directory):即pud

3、页中间目录( page middle directory):即pmd 页表的中间层

4、页表(page table entry):pte

5、页:即具体物理地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值