自己整理的linux内存管理子系统

上传人:kms****20 文档编号:37356376 上传时间:2018-04-15 格式:DOC 页数:10 大小:464KB
返回 下载 相关 举报
自己整理的linux内存管理子系统_第1页
第1页 / 共10页
自己整理的linux内存管理子系统_第2页
第2页 / 共10页
自己整理的linux内存管理子系统_第3页
第3页 / 共10页
自己整理的linux内存管理子系统_第4页
第4页 / 共10页
自己整理的linux内存管理子系统_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《自己整理的linux内存管理子系统》由会员分享,可在线阅读,更多相关《自己整理的linux内存管理子系统(10页珍藏版)》请在金锄头文库上搜索。

1、4-4 linux 内存管理子系统内存管理子系统4-4 linux 内存管理子系统 1 / 104-4 linux 内存管理子系统内存管理子系统4-4-1 linux 内存管理内存管理(参考课件) 物理地址:物理地址:cpu 地址总线上寻址物理内存的地址信号,是地址变换的最终结果 逻辑地址:逻辑地址:程序代码经过编译后,出现在汇编程序中的地址(程序设计时使用的地址) 线性地址:线性地址:又名虚拟地址虚拟地址,32 位 cpu 架构下 4G 地址空间CPU 要将一个逻辑地址转换为物理地址,需要两步: 1、首先 CPU 利用段式内存管理单元,将逻辑地址转换成线性地址; 2、再利用页式内存管理单元,

2、把线性地址最终转换为物理地址 相关公式: 逻辑地址逻辑地址=段基地址段基地址+段内偏移量段内偏移量(段基地址寄存器段基地址寄存器+段偏移寄存器段偏移寄存器)(通用的)16 位 CPU:逻辑地址逻辑地址=段基地址段基地址+段内偏移量段内偏移量(段基地址寄存器段基地址寄存器+段偏移寄存器段偏移寄存器) 线性地址=段寄存器的值16+逻辑地址的偏移部分物理地址=线性地址(没有页式管理)32 位 CPU:逻辑地址逻辑地址=段基地址段基地址+段内偏移量段内偏移量(段基地址寄存器段基地址寄存器+段偏移寄存器段偏移寄存器) 线性地址=段寄存器的值+逻辑地址的偏移部分物理地址线性地址(mapping 转换)AR

3、M32 位:逻辑地址逻辑地址=段基地址段基地址+段内偏移量段内偏移量(段基地址寄存器段基地址寄存器+段偏移寄存器段偏移寄存器) 逻辑地址=段内偏移量(段基地址为 0)线性地址=逻辑地址=段内偏移量(32 位不用乘以 32)物理地址线性地址(mapping 转换)*!以下都是 x86 模式下!* 段式与页式存储管理的比较如下表所示。段式页式分段由用户设计划分,每段对应一个相应的的程序模块,有完整的逻辑意义。分页用户看不见,由操作系统为内存管理划分。段面是信息的逻辑单位页面是信息的物理单位便于段的共享,执行时按需动态链接装入。页一般不能共享段长不等,可动态增长,有利于新数据增长。页面大小相同,位置

4、不能动态增长。二维地址空间:段名、段中地址;段号、段内单元号一维地址空间4-4 linux 内存管理子系统内存管理子系统4-4 linux 内存管理子系统 2 / 10管理形式上象页式,但概念不同往往需要多次缺页中断才能把所需信息完整地调入内存实现页(段)的共享是指某些作业的逻辑页号(段号)对应同一物理页号(内 存中该段的起始地址)。页(段)的保护往往需要对共享的页面(段)加上某 种访问权限的限制,如不能修改等;或设置地址越界检查,对于页内地址(段 内地址)大于页长(段长)的存取,产生保护中断。一、段式管理一、段式管理 1.1、16 位位 CPU:(没有页式管理):(没有页式管理)1.1.1、

5、段式管理的由来:、段式管理的由来: 16 位 CPU 内部有 20 位地址总线,可寻址 2 的 20 次方即 1M 的内存空间,但 16 位 CPU 只有 16 位的寄存器,因此只能访问 2 的 16 次方即 64K。因此就采用了内存分段的管 理模式,在 CPU 内部加入了段寄存器,这样 1M 被分成若干个逻辑段,每个逻辑段的要求 如下: 1、逻辑段的起始地址(段地址)必须是 16 的整数倍,即最后 4 个二进制位须全是 0 (因此不必保存)。 2、逻辑段的最大容量为 64K。段寄存器是为了对内存进行分段管理而增加的,段寄存器是为了对内存进行分段管理而增加的,1616 位位 CPUCPU 有有

6、 4 4 个段寄存器,程序可同个段寄存器,程序可同 时访问时访问 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:用于附

7、加段的访问。ES 中的值左移 4 位得到附加段起始地址,再加上 BX 中的 偏移量,得到一个存储单元的物理地址。三、三、3232 位位 CPUCPU2 种工作模式:实模式和保护模式1、实模式下,32 位内存管理和 16 位 CPU 是一致的。4-4 linux 内存管理子系统内存管理子系统4-4 linux 内存管理子系统 3 / 102、段基地址长达 32 位,每个段的最大容量 4G,段寄存器的值是段地址的 “选择器”,用该选择器从内存中得到一个 32 位的段地址,存储器单元的物理 地址就是该段地址加上段内偏移量。得到线性地址空间。从管理和效率的角度出发,线性地址被分为固定长度的组,成为页,

8、例 如 32 位机器,线性地址最大可为 4G,如果用 4KB 为一个页来划分,这样整个 线性地址就被划分为 2 的 20 次方个页。线性地址通过映射关系得到物理地址。四、linux 段管理所有段的基地址为 0,每个段的逻辑地址空间范围为 04G,因为每个段的 基地址为 0,因此,逻辑地址到线性地址映射不变,在 Linux 中所提到的逻辑 地址和线性地址指的也就是同一地址。看来,linux 巧妙的把段机制给绕过去 了,完全利用了分页机制。linux2.6.29 采用四级页管理架构。1.1.2、物理地址的形成方式:、物理地址的形成方式: 段地址:段地址:将段寄存器中的数值左移 4 位补 4 个 0

9、(乘以 16) ,得到实际的段地址。 段偏移:段偏移:在段偏移寄存器中。1)逻辑地址)逻辑地址=段基地址段基地址+段内偏移量段内偏移量(段基地址寄存器段基地址寄存器+段偏移寄存器段偏移寄存器)2)由逻辑地址得到物理地址的公式为:(因为没有页式管理,所以这一步就得到了物理地 址) 物理地址 PA=段寄存器的值16+逻辑地址的偏移部分(注意!)(段与段可能会重叠)按段式管理能访问 2 的 32 次方共 4GB 的空间(2 的 16 次方个段,每个段可以为 2 的 16 次方 byte 的大小) ,但是只有 20 位地址总线,因此只能访问 1M 的内存。1.2、32 位位 CPU: 1)实模式:实模

10、式:与 16 位时是一样的段寄存器的值16 就是段地址 2)保护模式:保护模式:段寄存器的值是一个选择器,间接指出一个 32 位的段地址段基地址长达 32 位,每个段的最大容量可达 4G,段寄存器的值是段地址的“选择器” (segment selector),用该“选择器”从内存(segment descriptor)中得到一个 32 位的段地址, 存储单元的线性地址就是段地址加上段内偏移量,这与 32 位 CPU 的物理地址的计算方式 完全不同。4-4 linux 内存管理子系统内存管理子系统4-4 linux 内存管理子系统 4 / 10!线性地址=段基地址+段内偏移量/逻辑地址(段选择器

11、指向的内存中存储的基地址+段偏移 寄存器)! 这里不用乘以 16 或者 32,因为段基址寄存器可以完全存下段地址。32 位 CPU 得到线性地址后,再经过页式管理就能得到物理地址二、页式管理二、页式管理 2.1 页页:线性地址被分为固定长度的组,称为页。例如 32 位的机器,每页 4KB,可划为 2 的 20 次方个页(划分虚拟单元),32 位机器的线性地址空间为 4G。 2.2 物理页物理页:也称为页框、页桢;分页单元把所有的物理内存也划分为固定长度的管理单位 (划分实在的单元),它的长度一般与线性地址页是相同的。它的长度一般与线性地址页是相同的。 二者的区别:页划分的是线性地址,物理页划分

12、的是实际的物理地址 二者的联系:1、页的长度一般相同,2、通过通过 mapping 转换转换,存在映射关系。 通过分页管理模型,由线性地址得到物理地址1、分页单元中,页目录的地址存放在 CPU 的 cr3 寄存器中,是进行地址转换的开始点。 2、每个进程,都有其独立的虚拟地址空间,运行一个进程,首先要将它的页目录地址放到 cr3 寄存器中,将其他进程的页目录地址保存下来。 3、每个 32 位的线性地址被划分为三部分:页目录索引(10 位) ;页表索引(10 位) ;偏移 (12 位) (mapping 映射关系由下图反映)映射关系由下图反映)4-4 linux 内存管理子系统内存管理子系统4-

13、4 linux 内存管理子系统 5 / 10上图中页的大小为 2 的 12 次方,即 4K。两级分页模型(页不算在内) *!以上都是 x86 模式!* *Linux 内存管理内存管理 Linux 有限度地使用有限度地使用了了 Intel 的段式管理机制,而的段式管理机制,而完全采用完全采用了页式管理机制。了页式管理机制。 (也可以说没(也可以说没 有采用段式管理)有采用段式管理) 所有段的基地址全部为零(那么所有段都重合,相当于只有一个段) 又因为“线性地址=段基地址+段内偏移量/逻辑地址偏移部分“, 所以“线性地址=逻辑地址“。 在 linux 系统中,逻辑地址=线性地址=虚拟地址 物理地址

14、线性地址(mapping 转换) linux 页式管理页式管理 linux2.6.29 内核采用了四级页式管理架构,来兼容二级、三级管理架构的 CPU。 页全局目录、页上级目录、页中间目录、页表(四级时,线性地址为 64 位)4-4 linux 内存管理子系统内存管理子系统4-4 linux 内存管理子系统 6 / 104-4-2 进程地址空间进程地址空间(参考课件)linux 操作系统采用虚拟内存管理技术虚拟内存管理技术,使得每个进程的地址空间都是独立的。该空间大小 是 3G,用户看到的都是虚拟地址,无法看到实际的物理地址。 虚拟内存管理的虚拟内存管理的优点优点:1、保护操作系统, 2、用户

15、程序可以使用比实际物理内存更大的地址空间。linux 将 4G 的虚拟地址空间划分为用户空间和内核空间。 用户空间:用户空间:00xbfffffff(03G):用户进程通常情况下只能访问用户空间。 内核空间:内核空间:0xc00000000xffffffff(3G-4G)用户空间对应进程,所以每当进程切换,用户空间就会跟着变化。每个进程的地址空间都 是独立的。每个进程的页目录、页表不一样,因此通过页式转换就可以得到不同的物理地 址。 例如: 同一个用户程序运行多次,产生多个进程,每个进程访问的虚拟地址(逻辑地址、线 性地址)都是一样的,但是每个进程都有一套独立的页目录、页表,因此得到的实际物理

16、 地址是不同的。每个进程的页目录和页表就可以理解为进程独立的用户空间。Fork(),execve(),malloc()等进程相关操作等进程相关操作分配的内存分配的内存,都是,都是虚拟地址虚拟地址。只有当进程去访。只有当进程去访 问新获取的虚拟地址时,才会由问新获取的虚拟地址时,才会由“请页机制请页机制”去分配去分配实际的物理地址实际的物理地址。4-4 linux 内存管理子系统内存管理子系统4-4 linux 内存管理子系统 7 / 10实际的物理内存只有当进程真的去访问新获取的虚拟地址时,才会由“请页机制”产 生“缺页”异常,从而进入分配实际页框的程序。该异常是虚拟内存机制赖以生存的基本 保证它会告诉内核去为进程分配物理页,并建立对应的页表,这之后虚拟地址才实实 在在地映射到了物理地址上。动态分配动态

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号