【问题标题】:Kernel high memory内核高内存
【发布时间】:2012-01-30 20:39:20
【问题描述】:

在操作系统设计中,内核通常被映射到一个高位虚拟内存地址,从而获得对上层内存部分的控制。下面留下的空间用于在用户空间中运行的应用程序,如“Linux 3/1 virtual address split”中所述。

我想知道的是,为什么会做出这个设计决策,或者内核为什么不使用内存的下部?这对我来说不是很清楚,或者我可能监督了一些事情。

编辑:这个问题是关于虚拟地址而不是物理地址。

【问题讨论】:

  • 只是一个猜测:一种约定,更容易记住应该保护哪些内存部分不受用户空间代码的影响
  • 好的,但是内核的内存总是有限的,或者用户空间内存可能被浪费了。因此,当内核需要额外的内存(例如,用于加载模块)时,它可以分配和设置特定的权限来保护它(启用分页时)。

标签: operating-system kernel


【解决方案1】:

这种设计的一些优点/原因:

  • 应用程序不需要关心内核的大小和位置,并且可能会假装它们是内存中唯一的,从大约 0 开始并向上跨越,很少或没有代码和数据重定位。因此,应用程序更易于设计和实现,并且它们不太可能出现与内存管理相关的错误。
  • 应用程序可能会使用更小/更短的地址/指针,从而节省一些内存。
  • 在 x86 CPU 中,16 位和 32 位地址空间从虚拟地址 0 开始,到大约 1MB(对于真实和虚拟 8086 模式)、16 MB(i80286+ 上的 16 位保护模式)和 4 GB 结束(32 位模式,虚幻模式)。将内核放在较低的地址将减少应用程序可用的地址范围(例如:32 位模式下的 16 位应用程序或 64 位模式下的 32 位应用程序)和/或使它们的内存管理复杂化。在 x86 上,将内核移动到虚拟地址空间的顶部通常是有意义的。

可能还有其他原因,通常是特定于平台的。在某些平台上,这两个选项之间可能几乎没有区别。然而在其他人的首选内核位置可能在较低的虚拟地址。细节很重要。

【讨论】:

  • 好的,这对我来说更有意义。但是我现在的理解是这样的:内核实现了虚拟内存管理,从而为所有用户应用程序提供了在地址 0x0 处重定位的能力。如果是这样,那么当内核是唯一控制内存的实例时,内核在内存中的位置就无关紧要了。有意义吗?
  • 不要忘记,在内核进行任何重定位之前,编译器必须生成可重定位的二进制文件。如果每个应用程序都可以从 ~0 开始,二进制文件中的代码可以更简单,二进制文件可能不包含任何重定位信息,编译器可以更简单或做更少的工作。
  • 查看整个系统、内核和应用程序。使内核(一件事)变得更复杂以简化应用程序及其开发通常是有益的,也就是说,简化许多其他事情。这是有道理的,因为应用程序开发人员不是也不应该像内核开发人员那样技术。就像我说的,细节很重要,包括谁做什么。
  • 好的,根据您的评论,我找到了以下Anatomy of a Program in Memory,这实际上是一篇很棒的文章。引起我注意的一句话是:“一旦启用了虚拟地址,它们就会应用于机器中运行的所有软件,包括内核本身。因此必须为内核保留一部分虚拟地址空间”。我以前不知道,它澄清了所有事情,所以谢谢你的“整个系统”提示。但是现在我问自己是否没有更好的方法来处理虚拟内存,但这不属于这里。
  • @macs 有点话题,但不能分享这个伟大的资源:@​​987654322@。如果你通过实验室,你会对东西有深刻的理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2014-11-28
  • 2013-09-13
  • 1970-01-01
  • 2015-04-28
  • 2019-08-21
  • 2011-08-25
相关资源
最近更新 更多