进程虚拟地址space和内核地址space?如何?

Process virtual address space and kernel address space? How?

我对内核或系统编程还很陌生,

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

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

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

在静态时 ELF 定义进程 Virtual space?

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

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

    • 这个内核地址 space 何时以及如何成为 mapped/linked? 比如,在共享库的情况下,特定文件由 vm struct 等指向。
    • 是代码流命中系统调用的时候吗?例如。
  3. 可执行文件大小是否完全决定进程大小(虚拟)?在什么情况下大小不同或完全不同。

有没有解释整体流程的文章?

编译 --> link/load --> 虚拟内存结构(内核地址 space/shared 对象等)

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

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

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

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

If ELF defines virtual address space then does ELF also defines kernel virtual address space? How? [ I assume kernel virtual address space is dynamically mapped at run time?]

executable文件只定义了用户地址的初始布局space.

If kernel address space is mapped to process address space then why doesn't process size(virtual) includes kernel size also?

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

When and How this kernel address space is mapped/linked? Like , In case of shared library the particular file is pointed by vm struct etc.

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

Does executable size determines process size (virtual) completely? in what context sizes differ or they are completely different.'

不是真的。大 executables 表示需要更大范围的逻辑地址。然而,一个小的 EXE 很容易描述大量的需求零页。此外,应用程序可以在执行时映射逻辑页面。 EXE只定义了逻辑地址space.

的初始状态