LINUX虚拟内存管理的MMAP系统调用.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
LINUX虚拟内存管理的MMAP系统调用.doc

LINUX虚拟内存管理的MMAP系统调用 (分析报告) 徐玫峰 9811516 当LINUX中的进程映象执行时,我们需要调入可执行映象的内容。但我们并不需要把这些数据直接调入物理内存,只需要把这些数据放入该进程的虚拟内存区。只有当我们在执行时用到这些数据时才真正调入内存。这种进程的映象和进程虚拟进程空间的连接叫内存映象。 当我们需要将进程映象调入进程的虚拟内存空间时,需要申请一段合适的虚拟内存空间,在这种情况下需要用到MMAP系统调用来获得所需的内存空间。 MMAP系统调用需要六个参数:所涉及的文件指针,申请内存的开始地址,申请内存的长度,所申请内存的保护字,所申请内存的标志字,申请内存的偏移量。MMAP调用它的实现函数 do_mmap() 来完成申请虚拟内存的任务。该函数先进行参数的有效性检查。在确认参数有效的基础上,在进程的虚拟内存空间中找到一块满足申请内存长度的空间。找到后,调用 do_munmap() 函数释放得到的虚拟内存块先前的映象结构,然后调用文件指针所指的文件操作中的映象函数对新申请的内存块映象。然后将该虚拟内存块插入虚拟内存管理的结构之中。如果相邻的虚拟内存块可以合并的话,将它们合并成一个新的更大的虚拟内存块。 下面详细讨论MMAP系统调用的流程: MMAP系统调用经翻译后变成对 do_mmap()函数的调用,现在解释一下这个函数的流程,首先是参数有效性检查: 先调整申请虚拟内存块的长度,如果它不是一也长度的整数倍的话,在原有的基础上加上小于一页长度的数,使所申请内存块的长度是一页长度的整数倍。如果原来申请内存的长度为零的话,则函数返回申请内存块的起始地址。 #define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)PAGE_MASK) PAGE_SIZE (1UL12) (4KB) PAGE_MASK (~(PAGE_SIZE-1)) (111111111111) 如果申请虚拟内存的长度超过3G或申请虚拟内存的起始地址加上内存块的长度超过3G的话,函数带错误参数信息返回。 if (len MAX_USER_ADDR || addr MAX_USER_ADDR-len) return -EINVAL; (MAX_USER_ADDR =0XC0000000UL) 如果申请内存块的偏移量和长度的和超过2的32次方产生溢出的话,函数带错误参数信息返回。 如果当前进程的虚拟内存空间是处于加锁状态,则判断已有的虚拟内存空间的长度加上现在申请内存的长度是否超过当前进程可上锁的内存的上限,如果超过就带重试错误信息返回。 if (locked current-rlim[RLIMIT_MEMLOCK].rlim_cur) return -EAGAIN; 结构rlimit用于资源管理,定义在linux/include/linux/resource.h中,成员共有两项:rlim_cur是资源的当前最大数目;rlim_max是资源可有的最大数目。在i386环境中,受控资源共有RLIM_NLIMITS项,即10项,定义在linux/include/asm-i386/resource.h中,如下表: 资源类型 数组下标 意 义 RLIMIT_CPU 0 以毫秒计的CPU时间 RLIMIT_FSIZE 1 最大文件长度 RLIMIT_DATA 2 最大数据长度 RLIMIT_STACK 3 栈大小的上界 RLIMIT_CORE 4 core文件长度的上界 RLIMIT_RSS 5 驻留进程集的上限 RLIMIT_NPROC 6 进程数目的上限 RLIMIT_NOFILE 7 打开文件数目的上限 RLIMIT_MEMLOCK 8 可锁住的内存的上限 RLIMIT_AS 9 地址空间的界限 如果当前文件指针非空,则判断映象的类型,如果是共享映象并且如果申请内存块的保护字置写保护但文件不是以可写的方式打开,则带存取访问禁止错误信息返回。如果文件上有强制锁,则带重试错误信息返回。如果文件是 Appen-only类型的文件,但文件是以写方式打开,则带存取禁止错误信息返回。如果文件是私有映象方式,如果文件是以读方式打开,则带存取错误信息返回。如果文件指针为空但映象类型不是私有方式映象,则带错误参数信息返回。 如果申请虚拟内存的标志字是”interpret address exactly”类型,则要求申请虚拟内存块的起始地址的低12

文档评论(0)

ailuojue + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档