地址空间的过程

时间:2014-03-30 13:54:42

标签: c linux linux-kernel operating-system

我有两个问题: -

  1. 假设进程的虚拟地址空间是32位,即4GB。如果我编写'真的很长'程序(增加代码段)以使其超出代码段的规定限制会发生什么? 行为是否会与数据段超出限制时发生的错误分配或分段错误类似?该程序至少会在崩溃之前启动吗?
  2. 在Linux中的C程序布局(32位地址空间)中,内核有1GB的空间。每个过程都会有这个空间。但内核始终存在于RAM中的一个地方,而不依赖于该过程。那么,每个进程的页表是否将虚拟地址空间的内核区域映射到相同的物理内存页面?进程空间中的内核区域也不是1GB,将总内核大小限制为最大1GB(即内核大小不能大于1GB )?

2 个答案:

答案 0 :(得分:1)

注意 - 您的问题与32位Linux有关。在64位中,它通常是相同的,但具有更大的数字,实际上是无限的(所以你只受到安装的实际内存的限制)。

  1. 您的计划无法开始运行 它将无法编译(如果单个对象太大)或链接(如果所有对象的大小太大)。无论哪种方式,它都永远不会开始运行 这可能会在明显低于4GB的限制下发生,具体取决于编译器。

  2. 内核的确限制为1GB 对于所有进程,3GB以上的虚拟地址部分是相同的。由于表是分层的,因此没有真正的重复 - 所有进程的顶级表只指向共享内核表。
    正如您所说,内核及其中的所有内容(可加载模块,内核的动态分配)限制为1GB。如果您编写内核代码,请保持简单明了。

答案 1 :(得分:1)

  

行为是否与错误的分配或类似   当数据段增加超出时发生的分段错误   限制?该程序至少会在崩溃之前启动吗?

loader 是一个程序,它将可执行对象文件的代码和数据加载到内存中,然后通过跳转到第一条指令来运行程序。如上所述,加载器将无法加载,因此无法启动程序的执行。会有不确定的行为。

  

那么,每个进程的页表是否映射了内核区域   虚拟地址空间到相同的物理内存页面?

不,内核维护一些交换内存,用于存储当前未运行的进程信息。当内核调度特定进程时,它会映射到其物理内存。