自己整理的linux内存管理子系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4-4 linux内存管理子系统
4-4-1 linux内存管理(参考课件)
物理地址:cpu地址总线上寻址物理内存的地址信号,是地址变换的最终结果
逻辑地址:程序代码经过编译后,出现在汇编程序中的地址(程序设计时使用的地址)线性地址:又名虚拟地址,32位cpu架构下4G地址空间
CPU要将一个逻辑地址转换为物理地址,需要两步:
1、首先CPU利用段式内存管理单元,将逻辑地址转换成线性地址;
2、再利用页式内存管理单元,把线性地址最终转换为物理地址
相关公式:
逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器)(通用的)
16位CPU:逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器)
线性地址=段寄存器的值×16+逻辑地址的偏移部分
物理地址=线性地址(没有页式管理)
32位CPU:逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器)
线性地址=段寄存器的值+逻辑地址的偏移部分
物理地址<——>线性地址(mapping转换)
ARM32位:逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器)
逻辑地址=段内偏移量(段基地址为0)
线性地址=逻辑地址=段内偏移量(32位不用乘以32)
物理地址<——>线性地址(mapping转换)
************************!!以下都是x86模式下!!********************************* 段式与页式存储管理的比较如下表所示。
段式
页式
分段由用户设计划分,每段对应一个相应的的程序模块,有完整的逻辑意义。分页用户看不见,由操作系统为内存管理划分。
段面是信息的逻辑单位
页面是信息的物理单位
便于段的共享,执行时按需动态链接装入。
页一般不能共享
段长不等,可动态增长,有利于新数据增长。
页面大小相同,位置不能动态增长。
二维地址空间:段名、段中地址;段号、段内单元号
一维地址空间
管理形式上象页式,但概念不同
往往需要多次缺页中断才能把所需信息完整地调入内存
实现页(段)的共享是指某些作业的逻辑页号(段号)对应同一物理页号(内存中该段的起始地址)。页(段)的保护往往需要对共享的页面(段)加上某种访问权限的限制,如不能修改等;或设置地址越界检查,对于页内地址(段内地址)大于页长(段长)的存取,产生保护中断。
一、段式管理
1.1、16位CPU:(没有页式管理)
1.1.1、段式管理的由来:
16位CPU内部有20位地址总线,可寻址2的20次方即1M的内存空间,但16位CPU 只有16位的寄存器,因此只能访问2的16次方即64K。因此就采用了内存分段的管理模式,在CPU内部加入了段寄存器,这样1M被分成若干个逻辑段,每个逻辑段的要求如下:
1、逻辑段的起始地址(段地址)必须是16的整数倍,即最后4个二进制位须全是0 (因此不必保存)。
2、逻辑段的最大容量为64K。
段寄存器是为了对内存进行分段管理而增加的,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中的偏移量,得到一个存储单元的物理地址。
三、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采用四级页管理架构。
1.1.2、物理地址的形成方式:
段地址:将段寄存器中的数值左移4位补4个0(乘以16),得到实际的段地址。
段偏移:在段偏移寄存器中。
1)逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器)
2)由逻辑地址得到物理地址的公式为:(因为没有页式管理,所以这一步就得到了物理地址)物理地址PA=段寄存器的值×16+逻辑地址的偏移部分(注意!!)(段与段可能会重叠)
按段式管理能访问2的32次方共4GB 的空间(2的16次方个段,每个段可以为2的16次方byte的大小),但是只有20位地址总线,因此只能访问1M的内存。
1.2、32位CPU:
1)实模式:
与16位时是一样的
段寄存器的值×16就是段地址
2)保护模式:
段寄存器的值是一个选择器,间接指出一个32位的段地址
段基地址长达32位,每个段的最大容量可达4G,段寄存器的值是段地址的“选择器”(segment selector),用该“选择器”从内存(segment descriptor)中得到一个32位的段地址,存储单元的线性地址就是段地址加上段内偏移量,这与32位CPU的物理地址的计算方式完全不同。