《Linux存储管理1.ppt》由会员分享,可在线阅读,更多相关《Linux存储管理1.ppt(80页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、计计算算机机操操作作系系统统第第4 4章章LinuxLinux存储管理存储管理计计算算机机操操作作系系统统Linux存储管理的功能存储管理的功能虚拟存储器功能:为每个进程提供虚拟存储器功能:为每个进程提供4GB的虚拟的虚拟内存空间内存空间存储保护:各个进程的虚拟存储空间彼此独立、存储保护:各个进程的虚拟存储空间彼此独立、相互隔离相互隔离存储共享:进程之间可以共享存储器存储共享:进程之间可以共享存储器计计算算机机操操作作系系统统7.1.1 Linux7.1.1 Linux分段机制分段机制 linux linux只定义了四种段寄存器的取值只定义了四种段寄存器的取值内核代码段内核代码段内核代码段内核
2、代码段 0 x10 0 x10 0 x10 0 x10内核数据段内核数据段内核数据段内核数据段 0 x18 0 x18 0 x18 0 x18 用户代码段用户代码段用户代码段用户代码段 0 x23 0 x23 0 x23 0 x23用户数据段用户数据段用户数据段用户数据段 0 x28 0 x28 0 x28 0 x28计计算算机机操操作作系系统统运行级别分为两级:0和3计计算算机机操操作作系系统统GDTGDT初始化信息在初始化信息在arch/i386/kernel/head.Sarch/i386/kernel/head.S中中计计算算机机操操作作系系统统4G线性地址空间分为用户空间和内核空间,
3、内核线性地址空间分为用户空间和内核空间,内核空间又分为物理内存区、虚拟内存分配区、高空间又分为物理内存区、虚拟内存分配区、高端页面映射区、专用页面映射区和系统保留映端页面映射区、专用页面映射区和系统保留映射区射区线性地址从线性地址从0 x00000000到到0 xBFFFFFFF的的3G为用为用户和内核共同访问,户和内核共同访问,0 xC0000000以上的以上的1G由由内核独享,用户态无法访问内核独享,用户态无法访问因此所有进程的页目录的后四分之一均指向内核因此所有进程的页目录的后四分之一均指向内核页目录的相应目录项。为减小同步的开销,内页目录的相应目录项。为减小同步的开销,内核只在处理核只
4、在处理page_fault时同步用户进程的页目时同步用户进程的页目录项,因此页目录项不一致的情况是有的录项,因此页目录项不一致的情况是有的Linux的线性地址空间分配的线性地址空间分配计计算算机机操操作作系系统统计计算算机机操操作作系系统统两级页表结构两级页表结构 Linux在i386上的分页线性地址线性地址物理地址物理地址32bits32bitspmd_t*dirpmd_t*dir+页帧首地址页帧首地址20bits PAGE_SHIFT20bits PMD_SHIFT)&(PTRS_PER_PMD-1)pgdpgdptepte计计算算机机操操作作系系统统总之,存储器只有一个页目录,有总之,存
5、储器只有一个页目录,有10241024个页目录项,个页目录项,每个页目录项又含有每个页目录项又含有10241024个页面项,因此,存储个页面项,因此,存储器一共可以分成器一共可以分成10241024102410241M1M个页面。由于每个页面。由于每个页面为个页面为4K4K字节,所以,存储器的大小正好(最字节,所以,存储器的大小正好(最多)为多)为4GB4GB。计计算算机机操操作作系系统统Intel x86保护模式的地址映射段选择子段选择子16bits16bits段内偏移段内偏移32bits32bits页内偏移页内偏移12bits12bits物理地址物理地址32bits32bits页目录索引页
6、目录索引10bits10bits 页表索引页表索引10bits10bits 逻辑地址逻辑地址线性地址线性地址物理地址物理地址GDTGDT LDT LDTpgdpgd、ptepte存在存在位位读写读写位位用户态用户态/核心态访核心态访问位问位表示是表示是否采用否采用写透方写透方式式表示是表示是否启用否启用高速缓高速缓存存访问访问位位已写已写标志标志位位页大小,页大小,4K(0)或或4M(1),只适,只适用于页目录表用于页目录表项项页目录表项和页表项页目录表项和页表项计计算算机机操操作作系系统统段访问属性:段访问属性:8bitPDPLSEC/ED R/W A 7 6 5 4 3 2 1 0P:存在
7、位,存在位,P=1表示段在物理存储器中,表示段在物理存储器中,P=0,段不在物段不在物理存储器中理存储器中DPL:段的访问特权级。访问段的访问特权级。访问0,1,2,3四级四级S:段种类,段种类,S=0:系统段描述符,系统段描述符,S=1为常规段描述符为常规段描述符E:执行位。执行位。E=0数据段,数据段,E=1代码段代码段C/ED位:数据段时,位:数据段时,ED=0向下扩展,向下扩展,ED=1向上扩展向上扩展R/W:读写位读写位A:访问位。访问位。A=1访问过。访问过。A=0尚无访问尚无访问计计算算机机操操作作系系统统linuxlinux三级分页结构三级分页结构 计计算算机机操操作作系系统统
8、三三级级分分页页结结构构是是Linux提提供供的的与与硬硬件件无无关关的的分分页页管管理理机机制制。当当Linux实实际际运运行行在在某某种种机机器器上上时时,需需要要按按照照该该种种机机器器硬硬件件的的存存储储管管理理机机制制来来实现分页存储管理实现分页存储管理 l lx86x86机器:两级分页机器:两级分页机器:两级分页机器:两级分页 l lALPHAALPHA、SPARCSPARC:三三级级分分页页Linux内内核核中中针针对对不不同同的的机机器器配配备备了了不同的分页结构的转换方法。不同的分页结构的转换方法。计计算算机机操操作作系系统统系统调用内存映射模块(mmap)内存管理模块(co
9、re)结构特定模块MMU交换控制模块(swap)Linux Linux的存储管理思想的存储管理思想计计算算机机操操作作系系统统说明:说明:上图是虚拟内存管理的程序模块,实现代码大上图是虚拟内存管理的程序模块,实现代码大部分放在部分放在/mm/mm目录下。目录下。内存映射模块(内存映射模块(内存映射模块(内存映射模块(mmapmmapmmapmmap)负责把磁盘文件或交换空间文件的逻辑负责把磁盘文件或交换空间文件的逻辑负责把磁盘文件或交换空间文件的逻辑负责把磁盘文件或交换空间文件的逻辑地址映射到虚拟地址,以及把虚拟地址地址映射到虚拟地址,以及把虚拟地址地址映射到虚拟地址,以及把虚拟地址地址映射到
10、虚拟地址,以及把虚拟地址映射到物理地址。映射到物理地址。映射到物理地址。映射到物理地址。计计算算机机操操作作系系统统交换模块(交换模块(交换模块(交换模块(swapswapswapswap)负责控制内存内容的换入和换出。采用交换机制,从负责控制内存内容的换入和换出。采用交换机制,从负责控制内存内容的换入和换出。采用交换机制,从负责控制内存内容的换入和换出。采用交换机制,从主存中淘汰最近没被访问的逻辑页,保存近来访问过主存中淘汰最近没被访问的逻辑页,保存近来访问过主存中淘汰最近没被访问的逻辑页,保存近来访问过主存中淘汰最近没被访问的逻辑页,保存近来访问过的逻辑页。的逻辑页。的逻辑页。的逻辑页。核
11、心内存管理模块(核心内存管理模块(核心内存管理模块(核心内存管理模块(corecorecorecore)负责核心内存管理功能,如页的分配、回收和请求调负责核心内存管理功能,如页的分配、回收和请求调负责核心内存管理功能,如页的分配、回收和请求调负责核心内存管理功能,如页的分配、回收和请求调页处理等功能,这些功能将别的内核子系统(如文件页处理等功能,这些功能将别的内核子系统(如文件页处理等功能,这些功能将别的内核子系统(如文件页处理等功能,这些功能将别的内核子系统(如文件系统)所使用。系统)所使用。系统)所使用。系统)所使用。计计算算机机操操作作系系统统结构特定的模块结构特定的模块结构特定的模块结
12、构特定的模块 负责给各种硬件平台提供通用接口,主要完成主存初负责给各种硬件平台提供通用接口,主要完成主存初负责给各种硬件平台提供通用接口,主要完成主存初负责给各种硬件平台提供通用接口,主要完成主存初始化工作及对页面故障的处理。这个模块是实现虚拟始化工作及对页面故障的处理。这个模块是实现虚拟始化工作及对页面故障的处理。这个模块是实现虚拟始化工作及对页面故障的处理。这个模块是实现虚拟内存的物理基础。内存的物理基础。内存的物理基础。内存的物理基础。计计算算机机操操作作系系统统SlabSlab分配器思想分配器思想小对象的申请和释放通过小对象的申请和释放通过小对象的申请和释放通过小对象的申请和释放通过s
13、labslabslabslab分配器来管理。分配器来管理。分配器来管理。分配器来管理。slabslabslabslab分配器有一组高速缓存,每个高速缓存保存同一种分配器有一组高速缓存,每个高速缓存保存同一种分配器有一组高速缓存,每个高速缓存保存同一种分配器有一组高速缓存,每个高速缓存保存同一种对象类型,如对象类型,如对象类型,如对象类型,如i i i i节点缓存、节点缓存、节点缓存、节点缓存、PCBPCBPCBPCB缓存等。缓存等。缓存等。缓存等。内核从它们各自的缓存种分配和释放对象。内核从它们各自的缓存种分配和释放对象。内核从它们各自的缓存种分配和释放对象。内核从它们各自的缓存种分配和释放对
14、象。每种对象的缓存区由一连串每种对象的缓存区由一连串每种对象的缓存区由一连串每种对象的缓存区由一连串slabslabslabslab构成,每个构成,每个构成,每个构成,每个slabslabslabslab由一个由一个由一个由一个或者多个连续的物理页面组成。这些页面种包含了已或者多个连续的物理页面组成。这些页面种包含了已或者多个连续的物理页面组成。这些页面种包含了已或者多个连续的物理页面组成。这些页面种包含了已分配的缓存对象,也包含了空闲对象。分配的缓存对象,也包含了空闲对象。分配的缓存对象,也包含了空闲对象。分配的缓存对象,也包含了空闲对象。计计算算机机操操作作系系统统创建创建slab对象过程
15、对象过程Slab分配器调用分配器调用Kmem_cache_grow()函数为缓存分函数为缓存分配一个新的配一个新的slab对象。对象。调用调用调用调用kmem_getpages()kmem_getpages()获取一组连续内存页框;获取一组连续内存页框;获取一组连续内存页框;获取一组连续内存页框;调用调用调用调用kmem_cache_slabmgamt()kmem_cache_slabmgamt()分配一个新的分配一个新的分配一个新的分配一个新的slabslab数据结构;数据结构;数据结构;数据结构;调用调用调用调用kmem_cache_init_objskmem_cache_init_obj
16、s()为新()为新()为新()为新slabslab中包含的中包含的中包含的中包含的所有对象定义构造方法;所有对象定义构造方法;所有对象定义构造方法;所有对象定义构造方法;调用调用调用调用kmem_slab_link_end()kmem_slab_link_end()将新的将新的将新的将新的slabslab插入到这个插入到这个插入到这个插入到这个高速缓存的双向链表的末尾。高速缓存的双向链表的末尾。高速缓存的双向链表的末尾。高速缓存的双向链表的末尾。计计算算机机操操作作系系统统6.6.3 空闲页面管理空闲页面管理-Buddy算法算法把把内内存存中中的的所所有有页页面面按按照照2的的整整数数次次幂幂
17、(2n)进进行行划划分分,其中其中n=05。对对物物理理内内存存空空间间进进行行六六次次划划分分:按按1个个页页面面、2个个页页面面.32页页面面 称称为为页页面面块块,简简称称页页块块:1页页块块、2页页块块.32块块对对于于每每种种页页面面块块按按照照它它们们前前后后顺顺序序两两两两结结合合成成一一对对Buddy“伙伴伙伴”l l按按按按照照照照1 1页页页页面面面面划划划划分分分分,1 1页页页页块块块块Buddy Buddy:0:0页页页页和和和和1 1页页页页、2 2页页页页和和和和3 3页、页、页、页、4 4页和页和页和页和5 5页页页页 l l按按按按照照照照2 2页页页页面面面
18、面划划划划分分分分,2 2页页页页块块块块Buddy Buddy:0-1:0-1和和和和2-32-3、4-54-5和和和和6-6-7 7、8-98-9和和和和10-1110-11、计计算算机机操操作作系系统统空闲页面的管理空闲页面的管理Linux采采取取两两种种方方法法管管理理内内存存的的空空闲闲页页面面:位位图图,空空闲闲页块组链表页块组链表free_areafree_area各个元素中的指针。各个元素中的指针。l lfree_area0free_area0free_area0free_area0中中中中的的的的mapmapmapmap指指指指向向向向内内内内存存存存按按按按照照照照1 1
19、1 1个个个个页页页页面面面面划划划划分分分分时时时时的的的的位位位位图图图图,free_area1free_area1free_area1free_area1中中中中的的的的mapmapmapmap指指指指向向向向内内内内存存存存按按按按照照照照2 2 2 2个个个个页页页页面划分面划分面划分面划分时时时时的位的位的位的位图图图图?l l当当当当一一一一对对对对BuddyBuddyBuddyBuddy的的的的两两两两个个个个页页页页面面面面块块块块中中中中有有有有一一一一个个个个是是是是空空空空闲闲闲闲的的的的,而而而而另另另另一一一一个个个个全全全全部部部部或或或或部部部部分分分分被被被被
20、占占占占用用用用时时时时,该该该该位位位位置置置置1 1 1 1。当当当当这这这这两两两两个个个个页页页页面面面面块块块块都都都都是是是是空空空空闲闲闲闲,或或或或都都都都被被被被全全全全部部部部或或或或部部部部分分分分占占占占用用用用时时时时,对对对对应的位置应的位置应的位置应的位置0 0 0 0。mapmap指向相应页面块的位图指向相应页面块的位图 计计算算机机操操作作系系统统计计算算机机操操作作系系统统空闲页面的分配空闲页面的分配请求分配请求分配3个页面,结果如下:个页面,结果如下:计计算算机机操操作作系系统统页面释放页面释放页面页面13释放释放计计算算机机操操作作系系统统LDT定位定位
21、在在x86中中对对当当前前LDT的的定定位位是是由由硬硬件件系系统统中中的的局局部部描描述述符符表表寄存器寄存器LDTR和相应的和相应的LDTR高速缓存高速缓存实现的。实现的。l lLDTRLDTR:是是是是一一一一个个个个1616位位位位寄寄寄寄存存存存器器器器,它它它它指指指指出出出出当当当当前前前前进进进进程程程程LDTLDT描描描描述述述述符符符符在在在在GDTGDT中中中中的的的的位位位位置置置置。在在在在进进进进程程程程切切切切换换换换时时时时,从从从从当当当当前前前前进进进进程程程程的的的的TSSTSS中取出中取出中取出中取出LDTLDT选择符的值,并装入选择符的值,并装入选择符
22、的值,并装入选择符的值,并装入LDTRLDTR寄存器内,寄存器内,寄存器内,寄存器内,l lLDTRLDTR高速缓存高速缓存高速缓存高速缓存:4848B B,存放当前进程的存放当前进程的存放当前进程的存放当前进程的LDTLDT计计算算机机操操作作系系统统LDT的定位机制的定位机制计计算算机机操操作作系系统统辅助特性位辅助特性位:G:粒度。粒度。G=1以页面以页面(4KB)为单位,在常规描述为单位,在常规描述符中。符中。G=0以字节为段长度单位,在系统描述符以字节为段长度单位,在系统描述符中中D:操作长度。操作长度。D=1,32位代码段。位代码段。D=0,16位代码段位代码段R:保留保留U:操作
23、系统程序员自行定义操作系统程序员自行定义计计算算机机操操作作系系统统6.2.3 分段机制的存储保护分段机制的存储保护1.地址越界保护地址越界保护80X86分段机制提供分段机制提供2级越界保护机制:级越界保护机制:第一级:访问段描述符表时第一级:访问段描述符表时l lGDTRGDTR寄存器的表限位限定了段号范围寄存器的表限位限定了段号范围寄存器的表限位限定了段号范围寄存器的表限位限定了段号范围l lLDTRLDTR高速缓存的表限位确定高速缓存的表限位确定高速缓存的表限位确定高速缓存的表限位确定LDTLDT段号范围段号范围段号范围段号范围第二级:访问具体的全局段或局部段时第二级:访问具体的全局段或
24、局部段时l l段限确定线性地址访问段限确定线性地址访问段限确定线性地址访问段限确定线性地址访问计计算算机机操操作作系系统统2.存取控制保护存取控制保护对存储区域设置访问权限保护该区域不被非法访对存储区域设置访问权限保护该区域不被非法访问问l l设置存储区域访问权限,设置访问者访问权限。设置存储区域访问权限,设置访问者访问权限。设置存储区域访问权限,设置访问者访问权限。设置存储区域访问权限,设置访问者访问权限。l l访问者的访问者的访问者的访问者的RPLRPL权限大于或等于段权限权限大于或等于段权限权限大于或等于段权限权限大于或等于段权限DPLDPL时,时,时,时,才允许访问才允许访问才允许访问
25、才允许访问设置存储区域的操作限制来保护该区域不被非法设置存储区域的操作限制来保护该区域不被非法操作操作l l段描述符属性字节设置段描述符属性字节设置段描述符属性字节设置段描述符属性字节设置R/WR/W位。位。位。位。R/WR/W为为为为1 1才允才允才允才允许写许写许写许写计计算算机机操操作作系系统统6.3 8086分页机制分页机制分页机制:线性地址分页机制:线性地址物理地址物理地址计计算算机机操操作作系系统统6.3.1 80 x86分页机制分页机制线性地址空间线性地址空间分成大小相同分成大小相同的页面,物理的页面,物理内存划分成同内存划分成同样大小存储块样大小存储块逻辑页面和物逻辑页面和物理
26、页面大小:理页面大小:4KB计计算算机机操操作作系系统统两级分页机制两级分页机制使用使用2级页表进行地址映射。级页表进行地址映射。第一级:页表目录第一级:页表目录第二级:页表第二级:页表计计算算机机操操作作系系统统6.3.2 地址转换地址转换32位线性地址划分成位线性地址划分成3个域:个域:计计算算机机操操作作系系统统地址转换地址转换计计算算机机操操作作系系统统页表目录表页表目录表页页表表目目录录表表每每一一个个表表项项是是32位位,指指向向每每一一个个页页表起始地址。表起始地址。页页表表目目录录域域为为10位位,页页表表目目录录表表最最多多可可以以有有1024个个表表项项。每每个个表表项项为
27、为4字字节节,页页表表目目录录表表的的最最大大长长度度为为4KB。页页表表目目录录表表在在内内存存中中占占用用一个页面。一个页面。计计算算机机操操作作系系统统页表目录页表目录页页表表目目录录有有1024个个表表项项,所所以以最最多多可可以以有有1024个个页页表表。每每个个页页表表中中最最多多可可以以有有1024个个表项指向物理地址空间中的表项指向物理地址空间中的1024个页面个页面 每每个个表表项项的的长长度度是是4字字节节,一一个个页页表表的的最最大大长长度为度为4KB,正好是一个物理页面的大小。正好是一个物理页面的大小。页表目录起始地址页表目录起始地址CR3寄存器寄存器计计算算机机操操作
28、作系系统统6.3.3 页表目录与页表的表项页表目录与页表的表项计计算算机机操操作作系系统统AVL 供操作系统自行定义使用。供操作系统自行定义使用。D修修改改位位。(仅仅对对页页表表表表项项有有意意义义)1:页页面面被被修修改改过过 0:页面未修改页面未修改A访问位。访问位。1:页表或页面被访问过:页表或页面被访问过 0:页表或页面未访问:页表或页面未访问U/S用户用户/系统访问权限位系统访问权限位 1:用户访问级:用户访问级 0:示系统访问级。:示系统访问级。W/R读读/写写保保护护位位。1:允允许许写写入入和和读读取取,0:不不允允许许写写入入,仅允许读取。仅允许读取。P存存在在位位。1:该
29、该页页表表或或页页面面在在内内存存 0:该该页页表表或或页页面面不不在在内存内存计计算算机机操操作作系系统统6.3.4 分页机制的存储保护分页机制的存储保护U/S位和位和W/R位位计计算算机机操操作作系系统统6.3.5 快表快表TLB性性能能问问题题:完完成成线线性性地地址址向向物物理理地地址址的的转转换换,需需要要3次次访访问存储器问存储器。解决方法:快表解决方法:快表在在80386中中,快快表表放放在在处处理理器器芯芯片片中中的的高高速速缓缓冲冲存存储储器器中中。称称为为转转换换旁旁视视缓缓冲冲存存储储器器TLB(Translation Look-aside Buffers)在在TLB中中
30、存存放放着着32个个最最近近使使用用的页表项(页面地址)的页表项(页面地址)快表满时淘汰算法:?快表满时淘汰算法:?统计结果:统计结果:TLB命中率为命中率为98%计计算算机机操操作作系系统统6.4 Linux分段和分页结构分段和分页结构虚拟地址空间:进程的虚拟存储空间分为两部分虚拟地址空间:进程的虚拟存储空间分为两部分:l l内内内内核核核核空空空空间间间间(系系系系统统统统空空空空间间间间)包包包包含含含含着着着着操操操操作作作作系系系系统统统统内内内内核核核核的的的的 代代代代 码码码码、数数数数 据据据据 和和和和 全全全全 局局局局 数数数数 据据据据 结结结结 构构构构 等等等等。
31、从从从从0 0 xc0000000 xc00000000 xffffffff,0 xffffffff,大小为大小为大小为大小为1 1GBGBl l用用用用户户户户空空空空间间间间(进进进进程程程程空空空空间间间间)包包包包含含含含着着着着进进进进程程程程本本本本身身身身的的的的程程程程序序序序代代代代码码码码和和和和数数数数据据据据以以以以及及及及管管管管理理理理该该该该进进进进程程程程所所所所需需需需的的的的各各各各种种种种数数数数据据据据结结结结构构构构。从从从从0 0 x00000000 x000000000 xbfffffff,0 xbfffffff,大大大大小小小小为为为为3 3GB
32、GB计计算算机机操操作作系系统统分段结构分段结构每个进程只有一个数据段、一个代码段。其描述每个进程只有一个数据段、一个代码段。其描述符直接放进符直接放进GDT中。中。计计算算机机操操作作系系统统计计算算机机操操作作系系统统6.4.2 Linux三级分页结构三级分页结构计计算算机机操操作作系系统统6.4.3 内核页表和进程页表内核页表和进程页表所有进程页目录表的后所有进程页目录表的后256项内容完全相同:内项内容完全相同:内核页表核页表计计算算机机操操作作系系统统6.5 Linux进程地址空间管理进程地址空间管理进程地址空间:虚存空间进程地址空间:虚存空间Linux将进程的程序空间分成一系列可以
33、不相将进程的程序空间分成一系列可以不相邻的块,分配给进程的代码段、数据段等使用。邻的块,分配给进程的代码段、数据段等使用。使用虚存区域可以使用页式存储管理难以实现使用虚存区域可以使用页式存储管理难以实现的存储共享和存储扩充等功能。的存储共享和存储扩充等功能。计计算算机机操操作作系系统统6.5.1 进程地址空间用户区的管理进程地址空间用户区的管理Linux使用使用mm_struct结构描述虚拟内存的用户区结构描述虚拟内存的用户区计计算算机机操操作作系系统统计计算算机机操操作作系系统统6.5.2 虚存区域虚存区域为为了了便便于于对对不不同同性性质质的的信信息息的的管管理理和和使使用用,Linux引
34、引 进进 了了 虚虚 存存 区区 域域(visual memory area)的概念。的概念。一一个个虚虚存存区区域域是是虚虚存存空空间间中中一一个个连连续续的的区区域域,在在这这个个区区域域中中的的信信息息具具有有相相同同的的操操作作和和访访问问特特性。性。系系统统设设置置了了一一个个vm_area_struct结结构构,用用来来每个虚拟区域进行描述。每个虚拟区域进行描述。计计算算机机操操作作系系统统计计算算机机操操作作系系统统计计算算机机操操作作系系统统Linux虚拟内存管理虚拟内存管理计计算算机机操操作作系系统统6.5.3 虚存区域的建立与映射虚存区域的建立与映射do_mmap()内核函
35、数内核函数计计算算机机操操作作系系统统6.6 Linux物理内存管理物理内存管理6.6.1Linux的物理内存空间的物理内存空间计计算算机机操操作作系系统统6.6.2 物理页面的管理物理页面的管理每个物理页面的管理信息记录在页面结构体每个物理页面的管理信息记录在页面结构体page_struct中。中。计计算算机机操操作作系系统统计计算算机机操操作作系系统统6.6.3 空闲页面管理空闲页面管理-Buddy算法算法把把内内存存中中的的所所有有页页面面按按照照2的的整整数数次次幂幂(2n)进进行行划划分分,其中其中n=05。对对物物理理内内存存空空间间进进行行六六次次划划分分:按按1个个页页面面、2
36、个个页页面面.32页页面面 称称为为页页面面块块,简简称称页页块块:1页页块块、2页页块块.32块块对对于于每每种种页页面面块块按按照照它它们们前前后后顺顺序序两两两两结结合合成成一一对对Buddy“伙伴伙伴”l l按按按按照照照照1 1页页页页面面面面划划划划分分分分,1 1页页页页块块块块Buddy Buddy:0:0页页页页和和和和1 1页页页页、2 2页页页页和和和和3 3页、页、页、页、4 4页和页和页和页和5 5页页页页 l l按按按按照照照照2 2页页页页面面面面划划划划分分分分,2 2页页页页块块块块Buddy Buddy:0-1:0-1和和和和2-32-3、4-54-5和和和
37、和6-6-7 7、8-98-9和和和和10-1110-11、计计算算机机操操作作系系统统静静态态数数组组free_area 管管理理各各个个空空闲闲页页块块组组。数数组有组有6个元素:个元素:计计算算机机操操作作系系统统空闲页面的管理空闲页面的管理Linux采采取取两两种种方方法法管管理理内内存存的的空空闲闲页页面面:位位图图,空空闲闲页块组链表页块组链表free_areafree_area各个元素中的指针。各个元素中的指针。l lfree_area0free_area0free_area0free_area0中中中中的的的的mapmapmapmap指指指指向向向向内内内内存存存存按按按按照照
38、照照1 1 1 1个个个个页页页页面面面面划划划划分分分分时时时时的的的的位位位位图图图图,free_area1free_area1free_area1free_area1中中中中的的的的mapmapmapmap指指指指向向向向内内内内存存存存按按按按照照照照2 2 2 2个个个个页页页页面划分面划分面划分面划分时时时时的位的位的位的位图图图图?l l当当当当一一一一对对对对BuddyBuddyBuddyBuddy的的的的两两两两个个个个页页页页面面面面块块块块中中中中有有有有一一一一个个个个是是是是空空空空闲闲闲闲的的的的,而而而而另另另另一一一一个个个个全全全全部部部部或或或或部部部部分分
39、分分被被被被占占占占用用用用时时时时,该该该该位位位位置置置置1 1 1 1。当当当当这这这这两两两两个个个个页页页页面面面面块块块块都都都都是是是是空空空空闲闲闲闲,或或或或都都都都被被被被全全全全部部部部或或或或部部部部分分分分占占占占用用用用时时时时,对对对对应的位置应的位置应的位置应的位置0 0 0 0。mapmap指向相应页面块的位图指向相应页面块的位图 计计算算机机操操作作系系统统计计算算机机操操作作系系统统空闲页面的分配空闲页面的分配请求分配请求分配3个页面,结果如下:个页面,结果如下:计计算算机机操操作作系系统统页面释放页面释放页面页面13释放释放计计算算机机操操作作系系统统6
40、.7 内存的分配与释放内存的分配与释放Linux提供了提供了 分分配配和和释释放放物物理理内内存存的的函函数数:kmalloc()和和kfree(),可可分分配配小小于于128KB的的连连续续物物理理内内存空间存空间分分配配和和释释放放虚虚拟拟内内存存的的函函数数:vmalloc()和和vfree(),(),可分配大于可分配大于128KB的虚拟内存空间的虚拟内存空间计计算算机机操操作作系系统统6.7.1 物理内存分配的数据结构物理内存分配的数据结构计计算算机机操操作作系系统统1.blocksize表表l lkmalloc()和和kfree()分分配配和和释释放放内内存存是是以以块(块(bloc
41、k)为单位进行的。为单位进行的。l l可可以以分分配配的的空空闲闲块块的的大大小小(13种种)记记录录在在blocksize表表中,它是一个静态数组,定义在中,它是一个静态数组,定义在/mm/kmalloc.c中:中:#if PAGE_SIZE=4096if PAGE_SIZE=4096 static const unsigned int static const unsigned int blocksizeblocksize=32,64,128,32,64,128,252252,508,1020,508,1020,20402040,4096-16,8192-16,4096-16,8192-1
42、6,16384-1616384-16,32768-16,65536-16,131072-16,0 32768-16,65536-16,131072-16,0;计计算算机机操操作作系系统统2page_descriptor(16B)(16B)对对kmalloc()分分配配的的内内存存页页面面块块中中加加上上一一个个信信息息头头,它它处处于于该该页页面面块块的的前前部部。页页面面块块中中信信息息头头后后的的空空间间是是可可以以分分配配的的内存空间内存空间。加加 在在 页页 面面 块块 前前 部部 的的 信信 息息 头头 称称 为为 页页 描描 述述 符符,定定 义义 在在/mm/kmalloc.c中
43、:中:struct struct page_descriptor page_descriptor struct page_descriptor struct page_descriptor*next*next;/*/*指向下一个页面块的指针指向下一个页面块的指针*/*/struct block_header struct block_header*firstfree*firstfree;/*/*本页中空闲块链表的头本页中空闲块链表的头*/*/int int orderorder;/*/*本页中块长度的级别本页中块长度的级别*/*/int int nfreenfree;/*/*本页中空闲的数目本
44、页中空闲的数目*/*/具有具有相同块单位相同块单位相同块单位相同块单位和和使用特性使用特性使用特性使用特性的页面块组成若干个的页面块组成若干个链表链表。计计算算机机操操作作系系统统3sizes表表(32B)Linux设置了设置了sizes数组,数组,对页面块进行描述对页面块进行描述。数组元素是数组元素是size_descriptor结构体,结构体,定义在定义在/mm/kmalloc.c中:中:structsize_descriptorstructpage_descriptor*firstfree;/*一般页块链表的头指针一般页块链表的头指针*/structpage_descriptor*dma
45、free;/*DMA页块链表的头指针页块链表的头指针*/intnblocks;/*页块中划分的块数目页块中划分的块数目*/intnmallocs;/*链表中各页块中已分配的块总数链表中各页块中已分配的块总数*/intnfrees;/*链表中各页块中尚空闲的块总数链表中各页块中尚空闲的块总数*/intnbytesmalloced;/*链表中各页块中已分配的字节总数链表中各页块中已分配的字节总数*/intnpages;/*链表中页块数目链表中页块数目*/unsignedlonggfporder;/*页块的页面数目页块的页面数目*/;计计算算机机操操作作系系统统4block_header由由size
46、s管理的各个页面块中每个块(空闲块和占用块)的管理的各个页面块中每个块(空闲块和占用块)的头部还有一个对该块进行描述的块头头部还有一个对该块进行描述的块头block_header:structblock_headerunsignedlongbh_flags;/*块的分配标志块的分配标志*/unionunsignedlongubh_length;/*块长度块长度*/structblock_header*fbh_next;/*指向下一空闲块的指针指向下一空闲块的指针*/vp;计计算算机机操操作作系系统统staticstructsize_descriptorsizes=NULL,NULL,127,0
47、,0,0,0,0,NULL,NULL,63,0,0,0,0,0,NULL,NULL,31,0,0,0,0,0,NULL,NULL,16,0,0,0,0,0,NULL,NULL,8,0,0,0,0,0,NULL,NULL,4,0,0,0,0,0,NULL,NULL,2,0,0,0,0,0,NULL,NULL,1,0,0,0,0,0,NULL,NULL,1,0,0,0,0,1,NULL,NULL,1,0,0,0,0,2,NULL,NULL,1,0,0,0,0,3,NULL,NULL,1,0,0,0,0,4,NULL,NULL,1,0,0,0,0,5,NULL,NULL,0,0,0,0,0,0;计计
48、算算机机操操作作系系统统void*kmalloc(size_tsize,intpriority)参数参数size是申请分配内存的大小,是申请分配内存的大小,l lpriority是申请优先级。是申请优先级。priority常常用的值为用的值为GFP_KERNEL和和GFP_ATOMIC 返回值:成功时,内存空间首地址;返回值:成功时,内存空间首地址;出错时,为出错时,为06.7.2 物理内存分配函数物理内存分配函数计计算算机机操操作作系系统统kfree()()用于释放由用于释放由kmalloc()()分配的内存分配的内存空间,格式:空间,格式:void kfree(void*void kfre
49、e(void*_ptr_ptr)l lptr是是kmalloc()分分配配的的内内存存空空间间的的首首地址。地址。计计算算机机操操作作系系统统内存空间分配与管理:内存空间分配与管理:l l采用采用采用采用BuddyBuddy算法实现算法实现算法实现算法实现计计算算机机操操作作系系统统6.7.3 虚拟内存分配函数虚拟内存分配函数由由vmalloc()分分配配的的虚虚存存空空间间称称为为虚虚拟拟内内存存块块(虚存块)。(虚存块)。由由vmalloc()()分配的虚存块用一个分配的虚存块用一个链表链表来管理,来管理,系统定义的指针变量系统定义的指针变量vmlist指向链表的表头,指向链表的表头,在在
50、mm/vmalloc.c中定义如下:中定义如下:计计算算机机操操作作系系统统static struct vm_struct static struct vm_struct*vmlist*vmlist=NULL;=NULL;结构结构vm_structvm_struct描述由描述由vmallocvmalloc()()分配的虚存块:分配的虚存块:struct struct vm_structvm_struct unsigned long unsigned long flagsflags;/*/*虚存块的标志虚存块的标志*/*/void void*addr*addr;/*/*虚存块起始地址虚存块起始地