【问题标题】:Process virtual address space and kernel address space? How?进程虚拟地址空间和内核地址空间?如何?
【发布时间】:2016-04-27 08:23:47
【问题描述】:

我对内核或系统编程非常陌生,

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

我的理解可能完全错误……

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

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

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

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

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

有任何文章解释了整体流程吗?

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

我知道它非常庞大,但对整体流程的解释会起作用。

【问题讨论】:

  • 一个帖子里的问题太多了,其中一些(Does kernel use virtual address only for user processes)被问过很多次了。
  • 我在这里得到的一些答案和其他帖子.. stackoverflow.com/questions/14540656/… ..... 相应地编辑了帖子

标签: memory-management linux-kernel linker loader virtual-memory


【解决方案1】:

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

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

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

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

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

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

这取决于系统及其计数方式。

何时以及如何映射/链接此内核地址空间?就像,在共享库的情况下,特定文件由 vm struct 等指向。

内核地址空间独立于任何进程而存在。如上所述,它通过所有进程共享的系统页表或所有进程共享的一组嵌套页表条目映射到进程。

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

不是真的。大型可执行文件表明需要更大范围的逻辑地址。但是,一个小的EXE可以轻松描述大量的需求零页面。此外,应用程序可以在执行时映射逻辑页面。 EXE 只定义了逻辑地址空间的初始状态。

【讨论】:

  • 感谢 user3344003 。明白了!它基本上看起来像初始化进程最初映射到内核页表/目录映射内核地址空间在更高的地址和其余进程只是将这些条目复制到自己的页表/目录中。 [在 linux 32 位中]tldp.org/LDP/khg/HyperNews/get/memory/linuxmm.html
猜你喜欢
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
  • 2011-12-27
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
相关资源
最近更新 更多