处理虚拟地址空间和内核地址空间?怎么样?

时间:2016-04-27 08:23:47

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

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

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

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

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

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

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

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

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

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

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

    我知道它非常广泛,但对整体流程的解释会有效。

1 个答案:

答案 0 :(得分:1)

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

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

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

  

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

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

  

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

这取决于系统及其如何进行计数。

  

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

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

  

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

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