Memory management 进程虚拟地址空间和内核地址空间?怎么用?

Memory management 进程虚拟地址空间和内核地址空间?怎么用?,memory-management,linux-kernel,linker,loader,virtual-memory,Memory Management,Linux Kernel,Linker,Loader,Virtual Memory,我对内核或系统编程非常陌生 我有几个关于虚拟内存的问题。主要与静态与运行时相关,[即ELF和加载/链接等],特定于linux-x86 我的理解可能是完全错误的 我知道虚拟内存是1G/3G的。其中,进程无法在用户模式下访问页\偏移量上方的地址-页\偏移量是虚拟地址 在静态时间ELF定义进程虚拟空间 如果ELF定义了虚拟地址空间,那么ELF是否也定义了内核虚拟地址空间?怎么用? [我假设内核虚拟地址空间是在运行时动态映射的?] 如果内核地址空间映射到进程地址空间,那么为什么进程大小(虚拟)不包括内核

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

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

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

我知道虚拟内存是1G/3G的。其中,进程无法在用户模式下访问页\偏移量上方的地址-页\偏移量是虚拟地址

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

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

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

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

  • 有没有解释整个流程的文章

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


    我知道它非常广泛,但对整个流程的解释将起作用。

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

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

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

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

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

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

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

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

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

    可执行文件大小是否完全决定了进程大小(虚拟)?在什么样的背景下大小不同或完全不同。”


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

    一篇文章中的问题太多,其中一些问题(
    内核是否仅将虚拟地址用于用户进程
    )以前被多次询问。我在这里和其他文章中得到了一些答案。。。。。编辑文章,谢谢用户3344003。明白了!它基本上看起来像init进程最初映射到内核页面表/目录,在更高的地址上映射内核地址空间,而进程的其余部分只是在自己的页面表/目录中复制这些条目。[在linux 32位中]