分类: 嵌入式
2011-09-14 20:35:08
内存是Linux内核所管理的最重要的资源之一,内存管理子系统是操作系统中最重要的部分之一。对于立志从事内核开发的工程师来说,熟悉Linux的内存管理系统非常重要。
地址类型
l 物理地址
l 线性地址(虚拟地址)
l 逻辑地址
物理地址
物理地址是指出现在CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果。
逻辑地址
程序代码经过编译后在汇编程序中使用的地址。
线性地址
线性地址又名虚拟地址,在32位CPU架构下,可以表示4G的地址空间,用16进制表示就是0x00000000到0xffffffff。
地址转换
CPU要将一个逻辑地址转换为物理地址,需要两步:首先CPU利用段式内存管理单元,将逻辑地址转换成线程地址,再利用页式内存管理单元,把线性地址最终转换为物理地址。
逻辑地址到线性地址映射保持不变,在Linux中所提到的逻辑地址和线性地址(或虚拟地址)指的也就是同一地址。看来,Linux巧妙地把段机制给绕过去了,而完全利用了分页机制。
Linux进程地址空间
虚拟内存
Linux操作系统采用虚拟内存管理技术,使得每个进程都有独立的进程地址空间,该空间是大小为3G,用户看到和接触的都是虚拟地址,无法看到实际的物理地址。利用这种虚拟地址不但能起到保护操作系统的作用,而且更重要的是用户程序可使用比实际物理内存更大的地址空间。
Linux将4G的虚拟地址空间划分为两个部分——用户空间与内核空间。用户空间从0到0xbfffffff,内核空间从3G到4G。用户进程通常情况下只能访问用户空间的虚拟地址,不能访问内核空间。例外情况是用户进程通过系统调用访问内核空间。
进程空间
用户空间对应进程,所以每当进程切换,用户空间就会跟着变化。
课件: Linux内存管理.pdf
实例: 内存的分配和使用.rar