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
Linux内核第五记
最新推荐文章于 2024-05-03 17:25:10 发布