Operating system 内核高内存

Operating system 内核高内存,operating-system,kernel,Operating System,Kernel,在操作系统设计中,内核通常映射到一个高虚拟内存地址,从而获得对上层内存部分的控制。下面留下的空间用于在用户空间中运行的应用程序,如“”中所述 我想知道的是,为什么要做出这个设计决定,或者为什么内核不使用内存的较低部分?这对我来说不是很清楚,也许我监督了一些事情 编辑:这个问题涉及虚拟地址而非物理地址。这种设计的一些优点/原因: 应用程序不需要关心内核的大小和位置,可以假装它们是内存中唯一的内核,从0左右开始,向上扩展,代码和数据的重新定位最少或没有。因此,应用程序更易于设计和实现,并且不太可能

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

我想知道的是,为什么要做出这个设计决定,或者为什么内核不使用内存的较低部分?这对我来说不是很清楚,也许我监督了一些事情


编辑:这个问题涉及虚拟地址而非物理地址。

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

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

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

只是一个猜测:一个约定,可以更容易地记住哪些部分的内存应该受到用户空间代码的保护OK,但是内核的内存总是有限的,或者用户空间内存可能会被浪费。因此,当内核需要额外的内存时(例如加载模块),它可以分配并设置保护它的特定权限(当分页被启用时)。但我现在的理解是这样的:内核实现了虚拟内存管理,从而为所有用户应用程序提供了在地址0x0处重新定位的能力。如果是这样,那么内核在内存中的位置就无关紧要了,因为内核是控制内存的唯一实例。有意义吗?不要忘记,在内核进行任何重新定位之前,编译器必须生成可重新定位的二进制文件。如果每个应用程序都可以从~0开始,那么二进制文件中的代码可能会更简单,二进制文件可能不包含任何重新定位信息,编译器可能会更简单,或者做的工作更少。看看整个系统、内核和应用程序。让内核变得更复杂以简化应用程序及其开发通常是有益的,也就是说,简化许多其他事情。这是有道理的,因为应用程序开发人员不应该像内核开发人员那样专业。就像我说的,细节很重要,包括谁做什么。好吧,根据你的评论,我发现下面这篇文章实际上是一篇很棒的文章。我注意到的一句话是:“一旦启用了虚拟地址,它们将应用于机器中运行的所有软件,包括内核本身。因此,必须为内核保留一部分虚拟地址空间。”。我以前不知道这一点,它澄清了所有的事情,所以谢谢你的“整个系统”提示。但现在我在问自己,是否有更好的方法来处理虚拟内存,但这不属于这里。@macs有一点主题,但不能坚持分享这个伟大的资源:。如果你通过实验室,你会对事物有深刻的了解。