linux内存管理

来源:互联网 发布:淘宝网经典案例 编辑:程序博客网 时间:2024/05/22 00:24

 一、  CPU要将一个逻辑地址转换为物理地址,需要2步:首先CPU利用段式内存管理但愿,将罗技地址转换成线性地址,再利用页式管理但愿,把线性地址转换为物理地址。

        段式管理:
       16位的CPU内部拥有20位地址线,寻址范围2的20次方,1M的内存空间。16位CPU用于存放地址的寄存器 (IP,SP)只有16位

只能访问65536个存储单元,64K。无法用16位寄存器存放20位的地址。

   采取分段技术:

      为了能够访问1M的内存空间,CPU就采用了内存分段的管理模式,并在CPU内部加入了段寄存器。16位CPU把1M内存空间分为若干个罗技段,每个段要求如下:

  1、逻辑段的起始地址(段地址)必须是16的倍数,即最后4个二进制位必须全为0.

  2、逻辑段的最大容量为64K。

  物理地址的形成方式:

  由于段地址必须是16的倍数,所以值的一般形式,前16位二进制是变化的,后四位是固定的0,鉴于段地址的这特性,可以只保存前16位的二进制位来保存整个段基地址,所以每次使用时候要用段寄存器左移 补4个0来得到实际的段地址。在确定了某个存储单元所属的段后,只是知道了该存储器但愿所属的范围(段地址-》段地址+65536),如果想确定该内存单元的具体位置,还必须知道该但愿在段内的偏移。有了段地址和偏移量,就可以确定位置了。

   逻辑地址得到物理地址的公式为:PA=段寄存器的值*16+逻辑地址(段内偏移)

   二、

     段寄存器是为了对内存进行分段管理而增加的,16位CPU有4个段寄存器,程序可同时访问4个不同含义的段。

  1、CS+IP:用于代码段的访问,CS指向存放程序的段基地址,IP指向下条要执行的执行在CS端的偏移量,用这2个寄存器就可以得到一个内存物理地址,该地址存放着一条要执行的指令。

2、SS+SP:用于堆栈段的访问,SS指向堆栈段的基地址,SP指向栈顶了,可以通过SS和SP两个寄存器直接访问栈顶单元的内存物理地址。

 3、DS+BX:用于数据段的访问。DS中的值左移4位得到数据段起始地址,再加上BX中的偏移量,得到一个存储单元的物理地址。

 4、ES+BX:用于附加段的访问。ES中的值左移4位得到附加段起始地址,再加上BX中的偏移量,得到一个存储单元的物理地址。


1, 代码段寄存器CS:存放当前正在运行的程序代码所在段的段基值,表示当前使用的指令代码可以从该段寄存器指定的存储器段中取得,相应的偏移值则由IP提供。  

2, 数据段寄存器DS:指出当前程序使用的数据所存放段的最低地址,即存放数据段的段基值。  

3, 堆栈段寄存器SS:指出当前堆栈的底部地址,即存放堆栈段的段基值。  

4, 附加段寄存器ES:指出当前程序使用附加数据段的段基址,该段是串操作指令中目的串所在的段。

三、32位CPU

   2种工作模式:实模式和保护模式

  1、实模式下,32位内存管理和16位CPU是一致的。

  2、段基地址长达32位,每个段的最大容量4G,段寄存器的值是段地址的“选择器”,用该选择器从内存中得到一个32位的段地址,存储器单元的物理地址就是该段地址加上段内偏移量。得到线性地址空间。

      从管理和效率的角度出发,线性地址被分为固定长度的组,成为页,例如32位机器,线性地址最大可为4G,如果用4KB为一个页来划分,这样整个线性地址就被划分为2的20次方个页。

      线性地址通过映射关系得到物理地址。

四、linux段管理

    所有段的基地址为0,每个段的逻辑地址空间范围为0~4G,因为每个段的基地址为0,因此,逻辑地址到线性地址映射不变,在Linux中所提到的逻辑地址和线性地址指的也就是同一地址。看来,linux巧妙的把段机制给绕过去了,完全利用了分页机制。

linux2.6.29采用四级页管理架构。


原创粉丝点击