预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共80页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第4章Linux存储管理的功能7.1.1Linux分段机制 linux只定义了四种段寄存器的取值 内核代码段0x10 内核数据段0x18 用户代码段0x23 用户数据段0x28 运行级别分为两级:0和3 GDT初始化信息在arch/i386/kernel/head.S中 4G线性地址空间分为用户空间和内核空间,内核空间又分为物理内存区、虚拟内存分配区、高端页面映射区、专用页面映射区和系统保留映射区 线性地址从0x00000000到0xBFFFFFFF的3G为用户和内核共同访问,0xC0000000以上的1G由内核独享,用户态无法访问 因此所有进程的页目录的后四分之一均指向内核页目录的相应目录项。为减小同步的开销,内核只在处理page_fault时同步用户进程的页目录项,因此页目录项不一致的情况是有的……Intelx86保护模式的地址映射存在位段访问属性:8bit linux三级分页结构 系统调用说明: 上图是虚拟内存管理的程序模块,实现代码大部分放在/mm目录下。 内存映射模块(mmap) 负责把磁盘文件或交换空间文件的逻辑地址映射到虚拟地址,以及把虚拟地址映射到物理地址。交换模块(swap) 负责控制内存内容的换入和换出。采用交换机制,从主存中淘汰最近没被访问的逻辑页,保存近来访问过的逻辑页。 核心内存管理模块(core) 负责核心内存管理功能,如页的分配、回收和请求调页处理等功能,这些功能将别的内核子系统(如文件系统)所使用。 结构特定的模块 负责给各种硬件平台提供通用接口,主要完成主存初始化工作及对页面故障的处理。这个模块是实现虚拟内存的物理基础。Slab分配器思想 小对象的申请和释放通过slab分配器来管理。 slab分配器有一组高速缓存,每个高速缓存保存同一种对象类型,如i节点缓存、PCB缓存等。 内核从它们各自的缓存种分配和释放对象。 每种对象的缓存区由一连串slab构成,每个slab由一个或者多个连续的物理页面组成。这些页面种包含了已分配的缓存对象,也包含了空闲对象。6.6.3空闲页面管理-Buddy算法空闲页面的管理空闲页面的分配页面释放LDT定位LDT的定位机制辅助特性位: G:粒度。G=1以页面(4KB)为单位,在常规描述符中。G=0以字节为段长度单位,在系统描述符中 D:操作长度。D=1,32位代码段。D=0,16位代码段 R:保留 U:操作系统程序员自行定义6.2.3分段机制的存储保护2.存取控制保护 对存储区域设置访问权限保护该区域不被非法访问 设置存储区域访问权限,设置访问者访问权限。 访问者的RPL权限大于或等于段权限DPL时,才允许访问 设置存储区域的操作限制来保护该区域不被非法操作 段描述符属性字节设置R/W位。R/W为1才允许写6.38086分页机制6.3.180x86分页机制两级分页机制6.3.2地址转换地址转换页表目录表页表目录6.3.3页表目录与页表的表项6.3.4分页机制的存储保护6.3.5快表TLB6.4Linux分段和分页结构分段结构6.4.2Linux三级分页结构6.4.3内核页表和进程页表6.5Linux进程地址空间管理6.5.1进程地址空间用户区的管理6.5.2虚存区域Linux虚拟内存管理6.5.3虚存区域的建立与映射6.6Linux物理内存管理6.6.2物理页面的管理6.6.3空闲页面管理-Buddy算法静态数组free_area[]管理各个空闲页块组。数组有6个元素: 空闲页面的管理空闲页面的分配页面释放6.7内存的分配与释放6.7.1物理内存分配的数据结构1.blocksize表 lkmalloc()和kfree()分配和释放内存是以块(block)为单位进行的。 l可以分配的空闲块的大小(13种)记录在blocksize表中,它是一个静态数组,定义在/mm/kmalloc.c中: #ifPAGE_SIZE==4096 staticconstunsignedintblocksize[]={ 32,64,128,252,508,1020,2040, 4096-16,8192-16,16384-16, 32768-16,65536-16,131072-16,0 }; 2.page_descriptor(16B) 对kmalloc()分配的内存页面块中加上一个信息头,它处于该页面块的前部。页面块中信息头后的空间是可以分配的内存空间。 加在页面块前部的信息头称为页描述符,定义在/mm/kmalloc.c中: structpage_descriptor{ structpage_descriptor*next;/*指向下一个页面块的指针*/ structblock_header*firstfree;/*本页中空闲块链表的头*/ intorder;/*本页中块长度的级别*