您的位置:首页 > 运维架构 > Linux

Linux 内存管理

2012-03-05 12:24 169 查看
 首先回顾下linux内核的几个主要模块: system interface mmu driver 进程管理 虚拟文件系统 网络协议栈 与cpu相关的一些代码。

地址类型: 物理地址, 线性地址(虚拟地址), 逻辑地址。

物理地址: cpu地址总线上的寻址物理内存的地址信号,是地址变换的最终结果。

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

线性地址: 在32位cpu架构下, 占用4G 从0x0000000 到0xfffffff

地址转换:

 logica address--------> 通过段式内存管理单元-------> liner address------->通过页式内存管理单元--------->physical address。

那么什么是段式内存管理:

 

 16为cpu中有20位地址线,也就是说寻址范围是2的20次方, 为1M的空间。但是16位的cpu用于存放地址的寄存器(ip,sp....)只有16位,因此只能访问65536个存储单元(64K),而cpu采用内存段式管理模式,并且在cpu内部加入了段寄存器,16位的cpu把1M的内存空间分成了诺干个逻辑段,每个逻辑段的要求:

1> 逻辑的起始地址必须是16的倍数。

2> 逻辑段最大的容量是64k.

由于段地址为16的倍数,所以形式可以是:xxxxx0H,也即前16位的二进制是变化的,后四位的固定为0.因此可以保存前16位二进制来保存整个的基地址。所以每次使用时要用段寄存器左移4位,来得到实际的地址。(占用了二个寄存器)。

                                          逻辑地址  = 段基地址 + 段内偏移量。

                                          PA= 段寄存器x16+ 逻辑地址

段寄存器是为了对内存进行分段内存进行分段管理而增加的,16位的cpu有4个段寄存器。

而32位的cpu有些不同.分为实模式(和16的cpu相同) 和保护模式(我们的电脑一般是运行在这个模式下的)。

保护模式:  在32位的cpu中, 段基地址长达32位,每个段最大可达4G,段寄存器的值是段地址的选择器。用该选择器从内存中得到一个32位的段地址,储存单元的物理地址就是该段的地址加上段内偏移量。把基地址放如内存中,段寄存器中放的是存入指向内存的地址。要用的时候就从内存中拿出,再加上offset。

 

分页管理主要的是针对线性地址,把线性地址分为固定大小的组,称为页,如32位cpu中,线性地址最大为4G,把它为4K的页,则分成了2的20次方的组。另外的一个页指的是物理页或者是页框,页帧。分页管理单元把所有的物理也划为固定大小的管理单元。与线性页相同。下图可以解释下这两者的关系:

                              linear address(分成多个固定大小的组)  ——————————————>mapping(每组相对应)———————————————————————>physical address(同样是分成了固定大小的组)。

mapping

 

           cr3(cpu寄存器)------------>页目录(31-22位)----------->页表(21-12位)------------------>页(11-偏移)



以上的是计算机的主要概念, 现在讲述的是linux的段机制。linux中并没有完全采用intel 所提供的段机制,而是有限度的使用了分段机制,是因为很多RISC处理器并不支持分段。

在linux系统中,所有段的基地址都为0.这样就使得逻辑地址和线性地址相等了。这就是linux想系统的特点。linux2.6.29中采用了四页式管理,向下兼容。结合上面的图可以想像到四页管理机制。

页全局目录---------->页上级目录-------------> 页中间目录----------> 也表------------------------->页。

 

 

 

                              

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息