繁体   English   中英

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

[英]Process virtual address space and kernel address space? How?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM