Linux虚存分析报告

上传人:pu****.1 文档编号:472180328 上传时间:2023-08-16 格式:DOC 页数:29 大小:1.13MB
返回 下载 相关 举报
Linux虚存分析报告_第1页
第1页 / 共29页
Linux虚存分析报告_第2页
第2页 / 共29页
Linux虚存分析报告_第3页
第3页 / 共29页
Linux虚存分析报告_第4页
第4页 / 共29页
Linux虚存分析报告_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《Linux虚存分析报告》由会员分享,可在线阅读,更多相关《Linux虚存分析报告(29页珍藏版)》请在金锄头文库上搜索。

1、Linux 虚 存 分 析 报 告方 存 好第一章 前 言2第二章 LINUX虚存管理概述31、Linux虚存管理的基本特点32、Linux虚存管理的主要实现技术3第三章 LINUX虚存管理数据结构51、32-bit虚拟地址52、Linux的多级页表结构53、页表项的格式64、动态地址映射75、用户进程的虚拟内存结构86、我们的工作10第四章 PROCESS的虚存管理数据结构的建立、维护、拆除及相关系统调用流程111、进程的载入、创建及内存管理数据结构和链结关系的建立112、数据结构及链结关系的拆除(sys_exit)133、缺页中断服务14第五章 主要函数分析16Memory.c16mmap

2、.c22第六章 后记29第一章 前 言Linux是一个功能强大的操作系统,而内存管理则是操作系统的核心,它负责管理计算机系统的存储器。作为操作系统的核心,必须能够克服物理内存的局限,使用户进程在透明方式下,拥有比实际物理内存大得多的内存。其策略之一就是使用虚拟内存。Linux成功地实现了以虚拟内存为核心的内存管理策略,强大得分页机制,公平得交换方式,各类有效得高速缓存,以及以页保护为主得保护措施等。内存管理的目的是要尽可能地方便用户。同时Linux系统通过对用户进程虚存的有效管理,作到了虚存对一般用户和Linux程序员的透明。本文首先阐述了Linux虚存管理以基本特点和主要实现技术,并分析了L

3、inux虚存管理的主要数据结构及其相关关系。围绕它的建立、维护、使用和拆除,作了一个粗浅的剖析,因本人水平有限,有不当之处,请老师指正。同时应该指出的是本文所做的工作离不开同组的林涛、徐玫峰和范昭伟同学的帮助,谢谢他们。第二章 Linux虚存管理概述Linux的内存管理采用页式管理,使用多级页表,动态地址转换机构与主存、辅存共同实现虚拟内存:每个用户Process拥有4GB的虚拟地址空间,Process在运行过程中可以动态浮动和扩展,为用户提供了透明的、灵活有效的内存使用方式,下面简述Linux虚存管理以基本特点和主要实现技术:1、 Linux虚存管理的基本特点1. 更大的地址空间。虚拟内存可

4、以是系统实际拥有的物理内存的若干倍。因而它使得操作系统看起来拥有比实际大得多的内存。2. 合理的物理内存分配。Linux通过共享和交换策略,使各个运行的进程能公平地共享内存。3. 保护。Linux存储管理子系统为每一内存页设置了“上锁位”,在线性地址及每级页表页项上设置了“读/写”位,这样来确保某一个进程不受其他进程的干扰。即使某一个进程失败了,也不会影响到其他进程和操作系统本身。4. 共享虚拟内存Linux实现的虚拟内存允许两个进程之间互相共享内存,例如:共享的库。在这种情形之下,库代码仅存在于一个进程,而不需要为每一个应用都复制一份。2、 Linux虚存管理的主要实现技术1、 请求调页(d

5、emanding paging)与内存扩展用户Process创建时,并不是将它所需所有页都分配给相应物理页。开始时只装入页面中Process的第一个页面,其他页根据Process运行过程的请求从外存调入所需页面,当Process访问一个页表项P位为0的页中地址时,表示此页不在主存中,将产生缺页中断,系统调用 handle_mm_fault()处理访问异常,为之分配相应物理页后,它再调用s()函数,从外存中读入该页面。Linux是一种请求式分页存贮管理,这才使之可以运行大于主存空间的Process。2、 页换出策略内存中页面不足时,Linux使用页面AGE技术实现了页淘汰策略的最近最少使用(LR

6、U)算法:即每次换出时,总是选择最老的页换出,对易于从其他设备上获取的非脏(not dirty)页面。Linux采用丢弃(discarding)技术,如果发生过写操作,则将该页写入系统的S中,这样就可以加快换入的速度。3、 内存共享Linux将内存划分为4K大小的页面,为内存共享提供了基础:(1)不同进程间页面共享时,可令共享该页的Process 的页表项(pte)均指向该页。(2)对kernel代码和数据段的共享,通过Process创建时fork() 函数将kernel代码和数据段映射到用户虚存的3GB4GB的空间中去,所以每个Process都可以通过一定方式共享kernel的代码和数据段。

7、4、 内存保护采用了“Hole”技术、虚存段的保护、地址转换机构、页表存取控制位(R/W位)等技术实现了内存保护。“Hole”技术 物理内存前4K是一空页(empty_zero_page),用来捕获NULL指针的异常访问。在Process每个虚存段后,都有一个“4K”的“Hole”,用来捕获虚存段的越界访问。虚存段保护方式 主存中虚存段的全部或部分可以设为保护方式,防止非法访问。页表项存取控制位(R/W位) 页表项以“R/W”位表示此页的存取权限“1”为可读写,“0”为不可读写,可用来防止越权访问。地址转换机构 分页存贮管理方法中,地址转换机构进行的页面映象实际上防止了各Process的主存块

8、间互不干扰,起到Process 隔离的作用。5、 动态地址变换利用i386的地址变换机构Linux实现了动态地址变换,Process执行时访问到某一虚拟地址时才确定其对应的物理地址。这种方式为Process存贮块的动态和动态扩展提供了基础。第三章 Linux虚存管理数据结构1、32-bit虚拟地址在Linux 中,4GB的虚存需通过32-bit 地址进行寻址。(Linux 中虚拟地址与线形地址为同一概念)虚拟地址被分割成3 个子位段,其中2 个子位段包含10 位, 1 个子位段包含12 位,如图2.1所示:123图132位虚拟地址3个子位段分别表示不同含义:子位段1 指向被称作页目录(PGD)

9、的一张表,子位段2 指向被称作页表(PTE)的一张表,子位段3 指向页内地址。2、Linux的多级页表结构标准的Linux的虚存页表为三级页表,依次为页目录(Page Directory-PGD)、中间页目录(Page Middle Directory-PMD)、页表(Page Table)PTE)。如图2.2所示。图2 Linux的多级页表结构在i386机器上Linux的页表结构实际为两级,PGD和PMD页表是合二为一的。所有有关PMD的操作实际上是对PGD的操作。所以原代码中形如*-pgd-*()和*-pmd-*()的函数实现的功能也是一样的。页目录(PGD) 是一个大小为4K 的表,每一

10、个process只有一个页目录,以4 字节为一个表项,分成1024 个表项(或称入口点);该表项的值为所指页表的始地址。32位虚拟地址的第1 个子位段共10 位,其值的范围从0 到1023,对应于页目录的一个入口点。页目录(PTE)的每一个入口点的值为此表项所指的一页框(page frame),32位虚拟地址的第2 个子位段共10 位,其值的范围从0 到1023。页框(page frame)并不是物理页,它指是虚存的一个地址空间。3、页表项的格式Linux中页表每一个表项的格式,如图所示:图3 页表项格式其中,各位段的含义如下:P:存在位,表示该表项对地址的转换是否有效。i386 处理器在P=

11、0 时不解释表项中的任何位,此时这些位的含义完全由软件自行解释。P 位提供了至关重要的属性,以支持分页机制。如果P=1,则表示虚拟地址所对应的页框存在于物理内存中,访问该虚拟地址的程序可以正常运行;P=0,则表示虚拟地址所对应的页框不存在于物理内存中,访问该虚拟地址的程序将会引发页访问异常,产生缺页中断。使得Operating System 可以把缺少的页从磁盘上读入内存,并将读入页存入到表项中,然后将该页标志为存在,再使引起异常的程序继续执行。R/W:读写位,表示对该表项指向的页可以进行读、写或执行操作。R/W=1 则该页可写,可读,且可执行;R/W=0 则该页可读,可执行,但不可写。当处理

12、器处于特权级02时,R/W位被忽略。如该表项位于页目录中,则作用于该表项映射的所有各页。U/S:用户/系统位。U/S=1 则该页可在任何处理器特权级下访问;U/S=0 则该页只能在处理器特权级02下被访问。如该表项位于页目录中,则作用于该表项映射的所有各页。D:已写标志位。在对该表项映射的页进行写访问之前,处理器对该位置1。如该表项是页目录中表项,处理器不修改D位。Address:页框物理地址的高20位。系统将物理内存分割成4K大小的内存页框,Address实际上代表了页框的帧号。4、动态地址映射Linus虚存采用动态地址映射方式,即Process的地址空间和存储空间的对应关系是在程序的执行过

13、程中实现的:Process每用到一个地址时, 都需虚存的地址转换机构把虚拟地址转化为内存的实际地址。其地址映射如下图所示:图4 32位虚拟地址转换图动态地址映射使Linux可以实现Process在主存中的动态重定位,虚存段的动态扩展和移动;也为虚存的实现提供了基础。5、用户进程的虚拟内存结构用户进程的虚拟内存结构如图所示:mm_struct每一个进程的task_struct中都有一个结构mm_struct,此结构包含了进程中与储存管理相关的大部分信息,其申明如下:struct mm_struct int count;/ 使用该mm结构的个数,如果是多处理机,则有可能count 1pgd_t *

14、 pgd; /* 进程页目录的起始地址,如上图所示 */unsigned long context;unsigned long start_code, end_code, start_data, end_data;/*start_code、end_code:进程代码段的起始地址和结束地址。start_data、end_data:进程数据段的起始地址和结束地址。*/unsigned long start_brk, brk, start_stack, start_mmap;unsigned long arg_start, arg_end, env_start, env_end;/* arg_sta

15、rt、arg_end:调用参数区的起始地址和结束地址。env_start、env_end:进程环境区的起始地址和结束地址。*/unsigned long rss, total_vm, locked_vm;/* rss:进程内容驻留在物理内存的页面总数。*/unsigned long def_flags;struct vm_area_struct * mmap; /* 以双向链表组成的vma模块的首指针。 */struct vm_area_struct * mmap_avl; /* 以avl树结构组成的虚拟空间的首指针。*/struct semaphore mmap_sem;用户进程虚存管理的数据结构如图5所示。用户共有4GB的虚存空间,实际可申请的虚存空间为03GB。3GB4GB的虚存空间在用户进程创建时,已由函数fork()将kernel的代码段和数据段映射到3GB4GB的虚存空间。因而所有进程的3GB4GB的虚存空间的映象都是相同的,从而以这种方式使所有进程共享kernel的代码段和数据段。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号