Linux下的虚拟内存管理.ppt

  1. 1、本文档共81页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux下的虚拟内存管理

Linux下的虚拟内存管理 参考2.4.10 陆瑜 王琦 何宗键 2005. 4 Linux下的虚拟内存管理 虚拟内存基础 进程的内存组织 页面异常 页面的交换 Linux下的虚拟内存管理 虚拟内存基础 进程的内存组织 页面异常 页面的交换 虚拟内存的作用 使应用程序可以使用比物理内存大得多的内存。( Page Fault, Page in, Page out ) 提供内存的访问权限保护。 (Segment fault, Access Violation) linux虚拟内存空间 对于32位地址,意味着有4G字节的虚存空间。 系统空间:最高的1G字节(0xC0000000至0xFFFFFFFF)用于内核本身 。 用户空间:较低的3G字节(0x0至0xBFFFFFFF) 。 linux虚拟内存空间 分页 分页是把系统内存分成很小的页面,每个页面可以独立的从磁盘调入或调出。 分页单元把线性地址转换成物理地址。页内连续的线性地址被映射到连续的物理地址中。 分页机制可以实现请求调页、页面换出、内存共享和内存保护等功能,使进程可以使用大于内存容量的地址空间。 Linux使用的是分页机制,Linux内核不支持可变大小的页面,通常页面大小定义为4K。 地址映射 进程的线性地址分为四部分:页面目录索引(PGD)、页面中间目录索引(PMD)、页面表索引(PT)和偏移量。 线性地址到物理地址的转换采用三级转换方法。 在x86体系结构中,通过将页面中间目录定义为1,页面相关的宏可以把三级分解过程完美的转换到二级分解过程上去。 Linux将32位逻辑地址分成三部分:高10位是页目录索引,中间10位是页表索引,剩下的12位用作偏移量。这样就构成了4K大小的页面。 三层地址映射示意图 与内存相关的数据结构 Linux中页目录(PGD) 、页面中间目录(PMD)、页表(PT),分别由数据结构pgd_t,pmd_t,pte_t来表示。 typedef struct { unsigned long pmd; }pmd_t; typedef struct { unsigned long pte; } pte_t; typedef struct { unsigned long pgd; } pgd_t; typedef struct { unsigned long pgprot; }pgprot_t; //pgprot_t记录了页面的保护信息。 基本结构的定义 定义PGD,PMD,PTE等信息的代码如下: #define PGDIR_SHIFT 22 //线性地址中PGD下标位段的起始位置,即bit22(第23位) #define PTRS_PER_PGD 1024 //每个PGD表中指针的个数为1024 #define PMD_SHIFT 22 //PMD下标的起始位置也为22,与PGD相同,表示PMD位段的长度为0,所以PMD表的大小自然是20=1。(从三层映射落实到二层映射) #define PTRS_PER_PMD 1 #define PAGE_SHIFT 12 //线性地址中PTE下标位段的起始位置 #define PTRS_PER_PTE 1024 //每个PTE表中指针的个数为1024 Linux下的虚拟内存管理 虚拟内存基础 进程的内存组织 页面异常 页面的交换 几个重要数据结构: struct vm_area_struct 线性区描述符 每个线性区描述符表示一个线性地址区间。一个进程所需要使用的线性空间中的各个部分未必是连续的,通常形成若干离散的 “区间”,这就需要vm_area_struct数据结构来对线性区间进行抽象。 struct mm_struct 内存描述符 描述了与进程地址空间有关的全部信息,也是总的控制结构。每个进程只有一个mm_struct结构。 struct task_struct 进程描述符 进程控制块,包含了与一个进程相关的所有信息。 struct vm_operations_struct 用于对虚存的打开,关闭和建立映射。 进程的内存组织 线性区描述符 vm_area_struct (VMA) 内核使用一个或多个VMA来跟踪进程使用的内存区间。每个VMA代表进程地址空间的一块单独连续的区间。 进程的两个VMA可以不连续,区间的划分并不仅仅取决于地址的连续性,也取决于对虚存页面的访问权,如果一个地址范围内的前半页和后半页有不同的访问权或其他属性,就要分成两个区间。 进程所有VMA以链表的形式存储,若VMA数目较大的话,会创建一个AVL树来存储它们,因为AVL树中的搜

文档评论(0)

zhuwenmeijiale + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:7065136142000003

1亿VIP精品文档

相关文档