Linux 内存管理
2012-03-05 12:24
169 查看
首先回顾下linux内核的几个主要模块: system interface mmu driver 进程管理 虚拟文件系统 网络协议栈 与cpu相关的一些代码。
地址类型: 物理地址, 线性地址(虚拟地址), 逻辑地址。
物理地址: cpu地址总线上的寻址物理内存的地址信号,是地址变换的最终结果。
逻辑地址: 程序经过编译出现在汇编程序中的地址。
线性地址: 在32位cpu架构下, 占用4G 从0x0000000 到0xfffffff
地址转换:
logica address--------> 通过段式内存管理单元-------> liner address------->通过页式内存管理单元--------->physical address。
那么什么是段式内存管理:
16为cpu中有20位地址线,也就是说寻址范围是2的20次方, 为1M的空间。但是16位的cpu用于存放地址的寄存器(ip,sp....)只有16位,因此只能访问65536个存储单元(64K),而cpu采用内存段式管理模式,并且在cpu内部加入了段寄存器,16位的cpu把1M的内存空间分成了诺干个逻辑段,每个逻辑段的要求:
1> 逻辑的起始地址必须是16的倍数。
2> 逻辑段最大的容量是64k.
由于段地址为16的倍数,所以形式可以是:xxxxx0H,也即前16位的二进制是变化的,后四位的固定为0.因此可以保存前16位二进制来保存整个的基地址。所以每次使用时要用段寄存器左移4位,来得到实际的地址。(占用了二个寄存器)。
逻辑地址 = 段基地址 + 段内偏移量。
PA= 段寄存器x16+ 逻辑地址
段寄存器是为了对内存进行分段内存进行分段管理而增加的,16位的cpu有4个段寄存器。
而32位的cpu有些不同.分为实模式(和16的cpu相同) 和保护模式(我们的电脑一般是运行在这个模式下的)。
保护模式: 在32位的cpu中, 段基地址长达32位,每个段最大可达4G,段寄存器的值是段地址的选择器。用该选择器从内存中得到一个32位的段地址,储存单元的物理地址就是该段的地址加上段内偏移量。把基地址放如内存中,段寄存器中放的是存入指向内存的地址。要用的时候就从内存中拿出,再加上offset。
分页管理主要的是针对线性地址,把线性地址分为固定大小的组,称为页,如32位cpu中,线性地址最大为4G,把它为4K的页,则分成了2的20次方的组。另外的一个页指的是物理页或者是页框,页帧。分页管理单元把所有的物理也划为固定大小的管理单元。与线性页相同。下图可以解释下这两者的关系:
linear address(分成多个固定大小的组) ——————————————>mapping(每组相对应)———————————————————————>physical address(同样是分成了固定大小的组)。
mapping
cr3(cpu寄存器)------------>页目录(31-22位)----------->页表(21-12位)------------------>页(11-偏移)
以上的是计算机的主要概念, 现在讲述的是linux的段机制。linux中并没有完全采用intel 所提供的段机制,而是有限度的使用了分段机制,是因为很多RISC处理器并不支持分段。
在linux系统中,所有段的基地址都为0.这样就使得逻辑地址和线性地址相等了。这就是linux想系统的特点。linux2.6.29中采用了四页式管理,向下兼容。结合上面的图可以想像到四页管理机制。
页全局目录---------->页上级目录-------------> 页中间目录----------> 也表------------------------->页。
地址类型: 物理地址, 线性地址(虚拟地址), 逻辑地址。
物理地址: cpu地址总线上的寻址物理内存的地址信号,是地址变换的最终结果。
逻辑地址: 程序经过编译出现在汇编程序中的地址。
线性地址: 在32位cpu架构下, 占用4G 从0x0000000 到0xfffffff
地址转换:
logica address--------> 通过段式内存管理单元-------> liner address------->通过页式内存管理单元--------->physical address。
那么什么是段式内存管理:
16为cpu中有20位地址线,也就是说寻址范围是2的20次方, 为1M的空间。但是16位的cpu用于存放地址的寄存器(ip,sp....)只有16位,因此只能访问65536个存储单元(64K),而cpu采用内存段式管理模式,并且在cpu内部加入了段寄存器,16位的cpu把1M的内存空间分成了诺干个逻辑段,每个逻辑段的要求:
1> 逻辑的起始地址必须是16的倍数。
2> 逻辑段最大的容量是64k.
由于段地址为16的倍数,所以形式可以是:xxxxx0H,也即前16位的二进制是变化的,后四位的固定为0.因此可以保存前16位二进制来保存整个的基地址。所以每次使用时要用段寄存器左移4位,来得到实际的地址。(占用了二个寄存器)。
逻辑地址 = 段基地址 + 段内偏移量。
PA= 段寄存器x16+ 逻辑地址
段寄存器是为了对内存进行分段内存进行分段管理而增加的,16位的cpu有4个段寄存器。
而32位的cpu有些不同.分为实模式(和16的cpu相同) 和保护模式(我们的电脑一般是运行在这个模式下的)。
保护模式: 在32位的cpu中, 段基地址长达32位,每个段最大可达4G,段寄存器的值是段地址的选择器。用该选择器从内存中得到一个32位的段地址,储存单元的物理地址就是该段的地址加上段内偏移量。把基地址放如内存中,段寄存器中放的是存入指向内存的地址。要用的时候就从内存中拿出,再加上offset。
分页管理主要的是针对线性地址,把线性地址分为固定大小的组,称为页,如32位cpu中,线性地址最大为4G,把它为4K的页,则分成了2的20次方的组。另外的一个页指的是物理页或者是页框,页帧。分页管理单元把所有的物理也划为固定大小的管理单元。与线性页相同。下图可以解释下这两者的关系:
linear address(分成多个固定大小的组) ——————————————>mapping(每组相对应)———————————————————————>physical address(同样是分成了固定大小的组)。
mapping
cr3(cpu寄存器)------------>页目录(31-22位)----------->页表(21-12位)------------------>页(11-偏移)
以上的是计算机的主要概念, 现在讲述的是linux的段机制。linux中并没有完全采用intel 所提供的段机制,而是有限度的使用了分段机制,是因为很多RISC处理器并不支持分段。
在linux系统中,所有段的基地址都为0.这样就使得逻辑地址和线性地址相等了。这就是linux想系统的特点。linux2.6.29中采用了四页式管理,向下兼容。结合上面的图可以想像到四页管理机制。
页全局目录---------->页上级目录-------------> 页中间目录----------> 也表------------------------->页。
相关文章推荐
- CentOS (linux) 系统管理中的查看内存插槽数、最大容量和频率
- linux 共享内存管理
- linux下的管理内存相关的函数
- 轻松学习Linux之认识内存管理机制
- linux 系统管理中的查看内存插槽数最大容量和频率
- unix/linux下的共享内存、信号量、队列信息管理(进程间通信)
- Linux内存管理机制研究
- linux内存管理
- Linux-3.14.12内存管理笔记【kmalloc与kfree实现】【转】
- 分析linux内存管理机制
- Linux 内存管理子系统导读
- linux面试之内存管理
- 【linux】mm内存管理
- linux 内核如何管理内存
- [linux基础] 内存的管理内存的分配方式
- Linux企业级开发技术(6)——libevent企业级开发之内存管理
- Linux系统对IO端口和IO内存的管理
- linux ------ 时间管理、内存使用及内核与用户间的数据传递
- Linux内存管理机制研究
- Linux 内存管理系统:初始化