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