2011-12-30 52 views
4

在操作系统设计内核被最总是映射到高虚拟存储器地址,从而获得上部存储器部分的控制。下面的空间用于在用户空间中运行的应用程序,如“Linux 3/1 virtual address split”中的出色方法所述。内核高存储器

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

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

+0

只是一个猜测:一个约定,使得更容易记住哪部分内存应该被用户空间代码保护 – ren 2011-12-30 23:21:04

+0

好吧,但是内核的内存总是有限的,或者用户空间内存可能被浪费了。所以,当内核需要额外的内存时(例如加载模块),它可以分配和设置特定的权限来保护它(当启用分页时)。 – 2011-12-31 07:43:06

回答

6

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

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

可能有其他的原因,通常是特定于平台。在某些平台上,这两种选择可能几乎没有区别。而在另一些地方,首选的内核位置可能在较低的虚拟地址。细节很重要。

+1

好吧,这对我来说更有意义。但我现在的理解是这样的:内核实现虚拟内存管理,从而为所有用户应用程序提供在地址0x0处重新定位的能力。如果是这样,那么当内核是控制内存的唯一实例时,内核在内存中的位置并不重要。说得通? – 2012-01-02 08:23:36

+1

不要忘记,在内核执行任何重定位之前,编译器必须生成可重定位的二进制文件。如果每个应用程序都可以以〜0开始,则二进制文件中的代码可以更简单,二进制文件可能不包含任何重定位信息,编译器可以更简单,也可以做更少的工作。 – 2012-01-02 08:31:56

+0

我意识到这一点,但这并不影响编译内核。如果内核是用重定位信息编译并实现虚拟内存管理,那么每个应用程序都可以以〜0开始,但是(在我看来)内核的“位置”并不重要。 – 2012-01-02 08:34:01