http://blog.sina.com.cn/s/blog_6720a9120100i02t.html
虚拟内存
- 是一种抽象,处于应用层的内存请求和MMU(内存管理单元)之间。
进程虚拟内存处理
- 代码段
- 初始化数据段
- 未初始化数据段
- 堆栈段
- 共享库
- 堆
内存寻址(MMU)
- 保护模式:不再使用BIOS,而是为计算机每个硬件提高驱动
实模式:BIOS必须在实模式下运行
逻辑地址到物理地址的过程,是地址翻译的过程:硬件的分段寻址(硬件电路),硬件的分页寻址(硬件电路)
- 8086系统中采取分段寻址的方式,后来出现了分页寻址,为了兼容之前的系统,所以采用了分段分页结合的方法
- risc体系只支持分页
- 2.6版本的Linux只有在80X86下才使用分段机制
内存寻址(linux的8086)
- 逻辑地址:程序的地址
- 线性地址:虚拟地址(4GB)
- 物理地址:实际的地址
逻辑地址-----分段单元(硬件)-----线性地址-----分页单元(硬件)-----物理地址
- 在linux下:逻辑地址和线性地址是一致的
分段(硬件)
分页(硬件)
- page:4kb(80386开始)
- 32为线性地址:3个域:目录(10位置),页表(中间10位),offset(最低12位)
TLB
- 转换后缓冲器,加速线性地址的转换
内存区的管理
slab分配器是Linux内存管理中非常重要和复杂的一部分,其工作是针对一些经常分配并释放的对象,如进程描述符等,这些对象的大小一般比较小,如果直接采用伙伴系统来进行分配和释放,不仅会造成大量的内碎片,而且处理速度也太慢。而slab分配器是基于对象进行管理的,相同类型的对象归为一类(如进程描述符就是一类),每当要申请这样一个对象,slab分配器就从一个slab列表中分配一个这样大小的单元出去,而当要释放时,将其重新保存在该列表中,而不是直接返回给伙伴系统。slab分配对象时,会使用最近释放的对象内存块,因此其驻留在CPU高速缓存的概率较高。