23.Linux内核:内存管理.doc
文本预览下载声明
23.Linux内核:内存管理
Linux的页式虚存
页式虚存的优点
大地址空间。对运行在系统中的进程而言,可用的内存总量可以超过系统的物理内存总量,甚至可以达到好几倍。运行在 i386 平台上的 Linux 进程,其地址空间可达 4GB。
进程保护。每个进程拥有自己的虚拟地址空间,这些虚拟地址对应的物理地址完全和其他进程的物理地址隔离,从而避免进程之间的互相影响。
页式虚存的概念
分页机制将虚拟地址空间和物理地址空间划分为大小相同的块,这样的块称为“内存页”简称为“页”。
为区分,通常将物理页称为“页架“或“页框”,虚存空间中的页称为“页”。
通过虚拟内存地址空间的页与物理地址空间中的页之间的映射,分页机制可实现虚拟内存地址到物理内存地址之间的转换。
图 说明了两个进程的虚拟地址空间的部分页到物理地址空间的部分页之间的映射关系。
图 虚拟地址到物理地址的映射模型
进程指令中的地址皆为虚拟地址。
指令执行时由CPU查找内存中页表将虚拟地址转换为物理地址后执行指令的操作。
每个进程各有的1-4G(i386)的虚拟地址空间。
每个进程各有一个页表。
共享
两进程页表表目指向相同内存页架时,该页为两进程共享页,如上图PFN4为共享页
一页可由任意多个进程共享
共享页在不同进程中可有不同的虚拟地址,即由页表中不同位置的表目指向该页架。
内核为所有进程的共享内存空间
应用程序有权建立共享内存
内核共享:
内核放置于物理内存的1M-4M的位置
各进程通过各自的页表,将内核映射到进程自身虚拟空间中3G-4G的位置
3G-4G称为内核空间
内核空间为各进程所共享
每一进程有位置、内容相同的页表表目指向放置内核的物理内存
内核代码中指令地址为1G-3G的虚拟地址
内核保护:
进程指向内核的页表表目中,标志页属性为系统页
用户空间指令(PC3G)访问系统页时CPU引发异常
内存映射
利用内存映射,可以将程序映象或数据文件映射到进程的虚拟地址空间中,对程序代码和数据的访问与访问内存单元一样。
内存映射给文件的访问带来了方便,简化了文件访问程序的编写。
新进程的执行利用内存映射机制
进程不把可执行程序映像全部装入内存
只是把程序代码段映射到虚拟内存指定位置,
内存映射建立时,文件内容并不在内存。
代码页被访问时引发缺页中断,由内核的相应中断处理程序将页内容从外存调入
i386页表
图 10-2 i386 系统中的页表项格式
P位表明页是否在内存
A位表明页是否被访问过
D位表明页是否被修改过
AD位可用于页面淘汰算法
R/W位用于页的只读保护
U/S位用于内核页的保护
页大小为4K,页帧号占20bit,最大为1M-1,进程最大页数为1M,进程地址空间为4G。
每个页表表目占4个字节,进程全部页表占4M,即1024页,称为页表页。
页表页由页目录表管理
页目录表目占4个字节,1024个表目正好占一页。
页表页可以不在内存,页目录必须在内存。
二级地址映射:
CPU根据地址的最高10bit查找页目录表,找到对应页表页,
CPU根据地址的中间10bit查找页表,找到对应页帧,
CPU根据地址的最后12bit在页帧中找到内存单元进行操作。
进程共享内核的实现:
各进程实际共享内核页表,内存中只有一份内核页表
而页目录表中指向内核页表的表目各进程是相同的,是进程创建时从父进程中复制的。
多级地址映射:
Linux内核支持三级地址映射,以支持更大的虚拟地址空间,
因为Linux是跨平台的操作系统。
Linux在i386平台上通过一些技巧使三级映射只有二级在起作用。
内存分配算法
位图的办法
利用位图可记录内存单元的使用情况。
例如,如果某个系统有 1024 字节内存,而内存的分配单元是 4 字节,则可以利用 1024/(4*8) = 32 个字节来记录使用情况。这 32 个字节的每个位分别代表相应分配单元的使用情况。如果位图中某个位为 1,则对应的分配单元是空闲的。
利用这一办法,内存的分配就可以通过对位值的检测来简化。如果一次要分配 5 个单元的空间,内存管理程序就需要找出 5 个连续位值均为 1 的位图位置,但这种操作比较慢,因为连续的位有时要跨越字节边界。
链表的办法
利用链表则可以分别记录已分配的内存单元和空闲的内存单元。通常这些内存单元设计为双向链表结构,从而可加速空闲内存的搜索或链表的处理。这种方法相对位图方法要好一些,也更加有效。
但一个大链表的顺序查找仍然很慢
位图与链表相结合的方法(LINUX采用)
图 Linux 物理页块的分配示意
Linux 的物理页分配采用链表和位图结合的方法。参照图 10-4,Linux 内核定义了一个称为 free_area 的数组,该数组的每一项描述某一种页块的信息。第一个元素描述单个页的信息,
显示全部