Linux内核第五记

Linux内存管理

1.地址类别:

·物理地址:指的是出现在CPU地址总线上的寻址理内存的地址信号,是地址变换的最终结果。
·逻辑地址:程序代码经过编译后在汇编程序中使用的地址。
·线性地址(虚拟地址):在32位CPU架构下,可以表示4G的地址空间,16进制表示就是从0x00000000~0xFFFFFFFF。

2.地址转换:
                   段式管理                            页式管理
逻辑地址--------------------->线性地址--------------------->物理地址

·还可参见:http://blog.csdn.net/leves1989/article/details/3305402

3.段式管理

3.1段式管理(16位CPU)

16的CPU内部拥有20位的地址线,它的寻址范围就是2^20=1M,但是16位的CPU用于存放地址的寄存器(IP,SP...)只有16位,因此只能访问65536个存储单元,即64KB。
为了能够访问到1M的内存空间,CPU就采用了内存分段的管理模式,并在CPU内部加入了段寄存器。16位CPU把1M内存空间分为若干个逻辑段。每个逻辑段的要求如下:

· 逻辑段的起始地址(段地址)必须是16的整数倍,即最后4位二进制位必须全为0;
· 逻辑段的最大容量为64KB(前16位二进制位来保存整个基地址)
所以每次使用时要用段寄存器左移补4个0来得到实际的段地址。

物理地址 = 段寄存器的值*16 + 逻辑地址偏移量(段寄存器中并不是保存完整的段基地址,仅仅是前16位)

16位CPU有四个段寄存器,程序可同时访问四个不同含义的段:

1)CS+IP:用于代码段的访问,CS指向存放的段基地址,IP指向下一条要执行的指令在CS段的偏移量。用这两个寄存器就可以访问物理地址,这个物理地址中存放在一条要执行的指令。
2)SS+SP:用于堆栈段的访问,SS指向堆栈段的基地址,SP指向栈顶,可以通过SS和SP两个寄存器直接访问栈顶单元的内存物理地址。
3)DS+BX:用于数据段的访问,DS指向数据段的基地址,BX为偏移量,通过DS和BX可以的到物理地址。
4)ES+BX:用于附加段的访问,同上。

3.2段式管理(32位CPU)

32位的CPU有两种模式:实模式(和16位一样)和保护模式

3.2.1保护模式
段基地址是32位的,每个段的最大容量是4GB,段寄存器的值是段地址的“选择器”,用该“选择器”从内存得到一个32为的段地址,该地址到全局描述符表中找到需要的段描述符,这个段描述符中就存放着真正的段物理首地址,然后再加上偏移地址量便得到了最后的物理地址。这里物理首地址和偏移地址都是32位的,所以可以直接相加。

段描述符:是一个结构体类型,有三个成员变量,段物理首地址,段界限,段属性。
全局描述符表:一个数组,其中的元素是段描述符类型的。
选择器:是该数组的下标,也就是索引。
全局描述符表寄存器(GDTR):
|  BYTE5  |  BYTE4  |  BYTE3  |  BYTE2  |  BYTE1  |  BYTE0  |
|-------------------------------------------------------|-------------|-------------| 
|             描述符表物理地址31······0            |描述符表长(字节数) |
|                                                                  |            15···0           |
|-------------------------------------------------------|-------------------------- |

其他参见:http://bbs.chinaunix.net/thread-2083672-1-1.html


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值