15.1. Linux 中内存管理.pdfVIP

  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文档。上传文档
查看更多
15.1. Linux 中的内存管理 15.1.3. ⾼和低内存 逻辑和内核虚拟地址之间的不同在配备⼤量内存的 32-位系统中被突出. ⽤ 32 位, 可能 寻址 4 G 内存. 是, 直到最近, 在 32-位 系统的 Linux 被限制⽐那个少很多的内存, 因 为它建⽴虚拟地址的⽅式. 内核( 在 x86 体系上, 在缺省配置⾥) 在⽤户空间和内核之间划分 4-G 虚拟地址; 在 2 个 上下⽂中使⽤同⼀套映射. ⼀个典型的划分分出 3 GB 给⽤户空间, 和 1 GB 给内核空 间. [47] 内核的代码和数据结构必须要适合这个空间, 是内核地址空间最⼤的消费者 是物理内存的虚拟映射. 内核不能直接操作没有映射到内核的地址空间. 内核, 换句话 说, 需要它⾃⼰的虚拟地址给任何它必须直接接触的内存. 因此, 多年来, 能够被内核处 理的的最⼤量的物理内存是能够映射到虚拟地址的内核部分的数量, 减去内核代码⾃ ⾝需要的空间. 结果, 基于 x86 的 Linux 系统可以⼯作在最多稍⼩于 1 GB 物理内存. 为应对更多内存的商业压⼒⽽不破坏 32-位 应⽤和系统的兼容性, 处理器制造商已经增 加了地址扩展特性到他们的产品中. 结果, 在许多情况下, 即便 32-位 处理器也能够寻 址多于 4GB 物理内存. 是, 多少内存可被直接⽤逻辑地址映射的限制还存在. 这样内 存的最低部分(上到 1 或 2 GB , 根据硬件和内核配置)有逻辑地址; 剩下的(⾼内存)没有. 在存取⼀个特定⾼地址页之前, 内核必须建⽴⼀个明确的虚拟映射来使这个也在内核 地址空间可⽤. 因此, 许多内核数据结构必须放在低内存; ⾼内存⽤作被保留为⽤户进 程页. 术语⾼内存对有些⼈可能是疑惑的, 特别因为它在 PC 世界⾥有其他的含义. 因此, 为 清晰起见, 我们将定义这些术语: Low memo y 逻辑地址在内核空间中存在的内存. 在⼤部分每个系统你可能会遇到, 所有的内存都是 低内存. High memo y 逻辑地址不存在的内存, 因为它在为内核虚拟地址设置的地址范围之外. 在 i386 系统上, 低和⾼内存之间的分界常常设置在刚刚在 1 GB 之下, 尽管那个边界在 内核配置时可被改变. 这个边界和在原始 PC 中有的⽼的 640 KB 限制没有任何关联, 并且它的位置不是硬件规定的. 相反, 它是, 内核⾃⾝设置的⼀个限制当它在内核和⽤ 户空间之间划分 32-位地址空间时. 我们将指出使⽤⾼内存的限制, 随着我们在本章遇到它们时. 15.1.4. 内存映射和 struct page 历史上, 内核已使⽤逻辑地址来引⽤物理内存页. ⾼内存⽀持的增加, 是, 已暴露这个 ⽅法的⼀个明显的问题 -- 逻辑地址对⾼内存不可⽤. 因此, 处理内存的内核函数更多在 使⽤指向 st uct page 的指针来代替(在 linux/mm .h 中定义) . 这个数据结构只是⽤来跟 踪内核需要知道的关于物理内存的所有事情. 2.6 内核(带⼀个增加的补丁)可以⽀持⼀个 4G/4G 模式在 x86 硬件上, 它以微弱的性 能代价换来更⼤的内核和⽤户虚拟地址空间. 系统中每⼀个物理页有⼀个 st uct page . 这个结构的⼀些成员包括下列: atomic_t count; 这个页的引⽤数. 当这个 count 掉到 0 , 这页被返回给空闲列表. void *vi tual; 这页的内核虚拟地址, 如果它被映射; 否则, NULL . 低内存页⼀直被映射; ⾼内存页常常 不是. 这个成员不是在所有体系上出现; 它通常只在页的内核虚拟地址⽆法轻易计算时 被编译. 如果你想查看这个成员, 正确的⽅法是使⽤ page_add ess 宏, 下⾯描述. unsigned long flags; ⼀套描述页状态的⼀套位标志. 这些包括 PG_locked , 它指⽰该页在内存中已被加锁, 以 及 PG_ ese ved , 它防⽌内存管理系统使⽤该页. 有很多的信息在 st uct page 中, 是它是内存管理的更深的⿊魔法的⼀部分并且和驱动 编写者⽆关. 内核维护⼀个或多个 st uct page 项的数组来跟踪系统中所有物理内存. 在某些系统, 有 ⼀个单个数组称为 mem_map . 是, 在某

文档评论(0)

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

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

1亿VIP精品文档

相关文档