0

我对内核或系统编程非常陌生,处理虚拟地址空间和内核地址空间?怎么样?

我有几个与虚拟内存有关的问题。主要与静态与运行时间有关[即ELF和加载/链接等],具体到linux-x86。

我的理解可能是完全错误的......

我知道的虚拟内存,它的分裂1G/3G。在用户模式下进程无法访问PAGE_OFFSET之上的地址 - PAGE_OFFSET是虚拟地址。

在静态时间ELF定义进程虚拟空间?

  1. 如果ELF定义的虚拟地址空间,然后做ELF还定义了内核的虚拟地址空间?怎么样?我假设内核虚拟地址空间在运行时动态映射?

  2. 如果内核地址空间映射到进程地址空间,那么为什么进程大小(虚拟)也包含内核大小呢?

    • 何时以及如何将此内核地址空间映射/链接? 像,在共享库的情况下,特定的文件被vm结构等指向。
    • 是否当代码流遇到系统调用?例如。
  3. 可执行文件大小是否完全决定进程大小(虚拟)?在什么情况下有所不同或者完全不同。

任何解释整体流程的文章?

编译 - >链接/负载 - >虚拟内存结构(内核地址空间/共享对象等)

我知道它很庞大的,但对整体流程的说明会工作。

+0

在一篇文章中有太多问题,其中一些问题('内核是否仅为用户进程使用虚拟地址)在很多时候被问过。 – Tsyvarev

+0

一些答案我在这里和其他帖子.. http://stackoverflow.com/questions/14540656/why-kernel-needs-virtual-addressing ..... 编辑帖子相应 –

回答

1

大多数系统为内核和用户地址空间定义逻辑地址范围。在某些系统中,范围完全取决于操作系统(它是如何设置页表的),而在其他系统上则是硬件完成的。

对于前者,页表通常是嵌套的。在这种情况下,多个页面表共享相同的条目。

对于后者,用户和内核地址空间通常有单独的页表。

如果ELF定义了虚拟地址空间,那么ELF是否也定义了内核虚拟地址空间?怎么样? [我假设内核虚拟地址空间在运行时动态映射?]

可执行文件只定义了用户地址空间的初始布局。

如果内核地址空间映射到进程地址空间,那么为什么进程大小(虚拟)还包括内核大小呢?

这将取决于系统以及它如何进行计数。

何时以及如何将此内核地址空间映射/链接?类似的,在共享库的情况下,特定文件被vm结构等指向。

内核地址空间独立于任何进程而存在。如上所述,通过让所有进程共享系统页表或由所有进程共享嵌套页表项,将其映射到进程。

可执行文件大小是否完全确定进程大小(虚拟)?在什么情况下有所不同或者完全不同。“

不是。大型可执行文件指示需要更大范围的逻辑地址。但是,一个小EXE可以很容易地描述大量的需求零页。另外,应用程序可以在逻辑页面执行时映射它们。 EXE只定义了逻辑地址空间的初始状态。

+0

谢谢user3344003。明白了!其基本上看起来像init进程初始映射到内核页表/目录映射高地址上的内核地址空间,剩下的进程只是将这些条目复制到自己的页表/目录中。 [在linux 32位] http://www.tldp.org/LDP/khg/HyperNews/get/memory/linuxmm.html –