Mlock分析报告课案_第1页
Mlock分析报告课案_第2页
Mlock分析报告课案_第3页
Mlock分析报告课案_第4页
Mlock分析报告课案_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Mlock 分析报告第一部分 Linux 存储管理机制一 80386 体系结构的内存管理功能80386 有两种工作模式:实地址模式和虚拟地址模式(又称保护模式) 。实地址模式是 为了与 8086 兼容而设置的。这时,只能寻址 1MB 的地址空间,不能启用分页机制,不区 分特权,分段功能也受到了极大的限制。 而在保护模式下,分段机制得到加强。虚地址空间 可为 16K 个段,每个段的大小可变,最大达到4GB 。段具有独立的属性,包括段长、起始地址、段类型和保护位等。 而且 80386 提供片内页管理机制, 通过两级页表来实现线性地址 和物理地址之间的映射,为 LINUX 的虚拟内存管理提供了直接的

2、支持。80386 的虚拟地址模式同时使用了分段机制和分页机制两级地址转换机制来进行地址 转换。第一级使用分段机制, 把包含段地址和段内偏移量的虚拟地址, 转换为一个线性地址。 第二级使用分页机制,把线性地址转换为物理地址。如图所示。存储管理子系统实现以下这些功能:更大的地址空间: 操作系统似的系看起来拥有一个比它实际拥有的地址大的多的地址空间,虚存能够实 现比物理存储空间许多倍的地址空间保护 每一个进程在系统中都有它自己的地址空间,虚地址空间使得各个进程完全分离开来, 因此一个进程运行一个应用程序完全不会影响到另一个进程 另外,硬件级的虚存机制为内 存提供了写保护,这就保证数据不会被非法的应用

3、程序重写存储映像存储映像用来把图象或数据文件映像到一个进程的地址空间 在存储映像中, 文件的内 容直接和进程的虚拟地址空间相连 平衡物理存储空间的分配存储管理子系统允许每一个运行的进程公平地竞争系统的物理存储空间共享虚存空间二 LINUX 的分页管理机制在 LINUX 中,每一个用户进程都可以访问 4GB 的线性虚拟内存空间。 其中从 0 到 3GB 的虚拟内存地址是用户空间,用户进程可以直接对其进行访问。从 3GB 到 4GB 的虚拟内存 地址为系统空间, 存放仅供核心态访问的代码和数据。 当用户进程试图对其访问时, 就会触 发处理器的特权级转换(从处理器的特权级 3 切换到特权级 0),即

4、从操作系统的用户态切 换到核心态。所有进程从 3GB 到 4GB 的虚拟空间映像都是一样的, LINUX 以此方式让核心态进程 共享代码段和数据段。核心态虚拟空间从 3GB 到 3GB+4M 的一段(也就是进程页目录第 768 项所管辖的范 围),被影射到物理空间 0 到 4M 段。因此, 进程处于核心态时, 只要通过访问虚拟空间 3GB 到 3GB+4M 段,即访问了物理空间 0 到 4M 段。上述两种空间对用户进程来说都是透明的, 用户进程所访问的内存地址都是连续的 4GB 线性虚拟地址。因此,我们首先关心的是 LINUX 是如何划分虚拟空间的。LINUX 采用“按需调页” ( Deman

5、d Paging)技术管理虚拟内存。标准 LINUX 的虚存页表应 为三级页表, 依次为页目录 (PGD ,Page Directory) 、中间页目录 (PMD ,Page Middle Directory) 和页表( PTE,Page Table)。每一个 page 都有一个标识符 PFN (Page Frame Number), 因此 ,虚地址也就由两部分 组成 : 一个页内偏移地址和一个 PFN ,每当处理器遇到一个虚地址 , 它就将虚地址的 PFN 转化成一个物理页面的起始地址 , 然后 , 在根据 page_offset 的值 , 找到实际的物理地址 , 这个过程中间要通过一个页表

6、来实现 , 其转换过程如下 :图 3. 虚地址经过页表转换成实地址的过程在一个页表中 , 每一行包含了下列数据 :有效位 : 用来描述页表的这个入口是否可用这个入口所对应的物理页表数存储控制信息 :其中包括是否可写 ,是否可执行页表的访问是通过把虚地址的 PFN 作为页表的偏移量来访问的 . 例如 PFN=5 , 则访问 的页表的入口为第六个表项 ( 0 为第一个表项 ).处理器处理一个页表的地址时 , 首先必须算出页表的 PFN 和 页内偏移量 . 要实现表 的大小为 2 的幂级大小,这个可以通过掩码 (masking) 和移位( shifting )来实现处理器 利用虚地址的 PFN 作为

7、目录来检索要处理处的页表的入口如果这个入口是可用的,处 理器从页表中取出这个页表项所对应的物理地址的 PFN 如果这个入口不可用,则说明进 程试图存取一个不在内存中的页面 在这种情况下, 处理器不能处理, 应该叫给操作系统来 实现,以便操作系统能够处理它进程通过发出一个 page fault 来通知操作系统,然后 操作系统就能够解释发出页面失配及其原因,如果进程从页表中访问一个可用的入口,则进程从页表中取得物理地址的 PFN ,然后 把这个数乘上页表的大小, 以便的到页表在物理内存中的起始地址, 最后在加上偏移量就得 到了要取数据或指令的正确内存地址Linux 的虚存管理 共享虚存虚存使得几个

8、进程更容易共享存储区所有存储操作都是通过页表来实现的,每一个 进程都有它私人的页表 如果两个进程想要共享一页物理内存,它的页帧号 () 必须 在两个进程的一个页表入口中能够找得到每一个进程的虚存都是有一个 mm_struct 结构来描述的,其中包括正在执行的映像 的信息和一个指向许多 vm_area_struct 结构的指针, 每一个 vm_area_struct 描述一段虚存 的起始地址和结束地址, 进程对那一段的存取权限和对这段存储区的一组操作。 当一个映像 被映射到一个进程的虚地址中, 一组 vm_area_struct 结构就产生了, 每一个 vm_area_struct 结构都代表一

9、段可执行的映像, 可执行代码、 初始化数据(变量)、未初始化数据等等。 Linux 支持许多标准的虚存操作,当 vm_area_struct 被产生后,一组对于虚存的正确的操作也就 跟他联系起来。按需调页中用到的虚存段的操作 当一个影响被影射进进程的虚地址后,它就可以执行了。只要影象的起始地址被印象 进物理内存, 它就要存取一个尚不在内存中的虚存段。 当一个进程访问一个尚没有合法的页 表入口的虚地址,它就回向操作系统报告一个页面失配的错误。页面失配错误描述发生页面失配的虚地址和引起页面失配的存储类型。Linux 必许找到表示发生页面失配的存储区的虚存段,由于沿着 vm_area_struct

10、结构 搜索对于处理页面失配的效率有非常重要的关系,这些虚存段被连接成 AVL 树结构,如果 表示页面失配的虚存段,则这个进程访问了一个非法的虚地址。 Linux 将用信号通知进程, 让进程发出一个 SIGSEGV 信号,如果进程不能处理这样的信息,则进程将要终止。 System 共享内存页面System 共享内存是一种内处理通讯机制( inter-process communication mechanism ), 允许两个或多个共享同一段虚存的进程互相通讯。进程如何用这种方式共享内存在 IPC-chapter 一章中有详细的说明, 现在可以很清楚地说 System 的每一块被共享的内存都 是

11、由一个 shmid_ds 的数据结构描述, 这个数据结构中包含一个指针指向一个 vm_area_struct 数据结构形成的队列,每一个共享这一段虚存的进程在这一个链表中都有一个节点, vm_area_struct 数据结构描述了在进程的什么地方开始使用共享的虚存。对于 System V 中的共享虚存, 指向它的所有 vm_area_struct 结构都是通过 vm_next_shared 和 vm_prev_shared 连接起来的。每一个 shmid_ds 数据结构也包含一个页表入口的链表,其中每一个 shmid_ds 数据结构包含了一个共享的虚页所映像到的物理页面入口。尽管虚存管理允许进

12、程有不同的地址空间(虚) ,但有时也需要进程共享同一段存储空 间例如有可能有几个进程运行于系统中且同时使用 bash 命令的 shell .此时并不是各进 程在自己的地址空间中分别拥有一个 bash 的拷贝,更好的方法是在物理空间上有一个 bash 的拷贝,所有运行 bash 的进程读共享它,动态链接库是另一个多进程共享执行代码的 例子存储共享机制也可以用来实现进程内部通讯, 两个或多个进程通过共享的存储空间来 交换信息,在 INTEL 微机上, LINUX 的页表结构实际为两级。 80386 体系结构之页管理机制中的 页目录就是 PGD ,页表就是 PTE。而 PMD 和 PGD 实际上是合

13、二为一的。在虚存段的加锁 操作中 , 主要涉及到的是对于页表的操作 :在 /include/linux/page.h 中通过一些宏定义来实现 ,#define PAGE_SHIFT12#define PAGE_SIZE (1UL i_mmap, for shm areas,* the list of attaches, otherwise unused.*/struct vm_area_struct *vm_next_share;struct vm_area_struct *vm_pprev_share;struct vm_operations_struct * vm_ops;unsigned

14、 long vm_offset;struct file * vm_file;unsigned long vm_pte;/* shared mem */;vm_mm 指向这个虚存段所属的 mm_struct 结构的指针 vm_start,vm_end :虚存段的起始、结束地址vm_next :同属于一个 mm_struct 的 vm_area_struct 形成一个链表, vm_next 指向下一 个此链表中的 vm_area_struct 节点vm_page_prot:vm_flags :虚存段的标志位,表示虚存段是否加锁vm_avl_height 、 vm_area_left 、 vm_ar

15、ea_right :为了便于查找,同一个 mm_struct 中的 vm_area_struct 组织成一个 avl 树,三个参数分别表示 avl 树的高度、当前节点在 avl 树 中的左儿子节点和右儿子节点vm_next_share 、 vm_pprev_share: vm_ops:指向一个 vm_area_struct 操作集的指针, 在此操作中, 包含了对 vm_area_atruct 的操作vm_offset :由于虚存段的组织需要映射到页的存储机构中,其中的vm_offset 表示虚存段的起始地址对于此虚存段起始地址所在也的偏移量vm_file :指向虚存段所在文件的指针, 同时对应

16、的 file 中也有一个计数器 f_count 用来 表示属于这个文件的虚存段的数目vm_pte:所在页表的入口在 Linux 中采用段页式来进行存储区的管理 其中进程的虚存管理的数据结构图示如下:图 2. 进程的虚存管理数据结构第二部分 虚存加锁虚存加锁的作用 虚存加锁在进程的页面换入和换出的工作中发挥了重要作用, 在页面的换出时, 如果表 示页面的虚存段被加锁, 则虚存段所表示的页面不能被换出, 这种机制在使一些较常用的进 程固定于内存, 似的调用这些进程的书牍大大加快, 同时也减少了许多页面调入和换出的工 作,从而似的的利用率更高。进程进行页 面的换出时,首先要找 到表示该页面的 vm_

17、area_struct 结 构,如 果 vm_area_struct 结构中有加锁的标志,则该页面不能被换出。操作系统在检查其他的页面, 其采用的算法是 (Least Recently Used) 算法。器具体的实现在页面的管理机制一章中有 详细的说明。原代码分析( mlock.c 中的函数分析)1) static inline int mlock_fixup_all(struct vm_area_struct *vma,int newsflags) 该函数用于对整个虚存段进行加锁,其中 vma 指向所要加锁的虚存段, newsflags 表示对虚存段进行操作后所加的标志。其中当 newsfl

18、ags=VM_LOCKED 时,表示对虚 存段加锁;当 newsflags 中的第十二位数位时,则表示对内存解锁。VM_LOCKED 的定义见 /linux/include/linux/mm.h其定义为: #define VM_LOCKED0x2000即将标志为的第十二位赋值为(从左到右)则表示虚存段为加锁状态,如此位 为,则表示虚存段为解锁状态。函数图示如下:) static inline int mlock_fixup_start(struct vm_area_struct * vma,unsigned long end, int newflags)该函数用于对虚存段的一部分加锁,加锁的部

19、分为从虚存段的起始地址开始,到end 地址结束,参数的含义跟上一函数的相同,其中 end 表示要加锁的虚存段的结束地址。 图示如下:) mlock_fixup_end(struct vm_area_struct * vma,startunsigned long start, int newflags) 该函数用于对虚存段的一部分加锁,其加锁的部分为从虚存段中的一个地址 开始,到虚存段的结束地址这一段进行加锁。其中 start 表示要加锁的起始地址 图示如下:) mlock_fixup_middle(struct vm_area_struct * vma,unsigned long start,unsigned long end, int newflags)该函数用于对虚存段中从 start 开始到 end 结束的一段进行加锁,其中 start 表示加锁 的开始地址, end 表示加锁的结束地址。图示如下:) mlock_fixup(struct vm_area_struct * vma, unsigned long start,unsigned long end, unsigned

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论