在布局内存时,编译器是否考虑了内核内存空间?

时间:2016-06-23 20:05:58

标签: c gcc memory linux-kernel

我正在努力调和一些概念。

我知道在内核和所有用户进程之间共享(映射)虚拟内存,我读了here。我还知道,当编译器为代码+数据生成地址时,内核必须将它们加载到该进程的正确虚拟地址。

为了限制问题的范围,当我提到“编译器”时,我只是指gcc。 那么编译器是否需要兼容每个新版本的操作系统,以便知道不将代码或数据放在为内核保留的高内存地址上?就像在编写那个编译器的人必须知道内核如何计划加载程序的细节一样(以免编译器将可执行代码放在高内存中)?

或者我混淆了不同的概念?通过this tutorial时我有点困惑,特别是在低内存地址中有操作系统代码的最底层,因为我认为Linux为内核使用了高内存。

2 个答案:

答案 0 :(得分:2)

编译器不会确定内存中放置内容的地址范围。这是由操作系统处理的。

首次执行程序时,加载程序将程序及其库的各个部分放在内存中。对于动态分配的内存,从操作系统分配大块,然后有时将其分成较小的块。

OS加载程序知道加载内容的位置。 OS的虚拟内存分配逻辑如何在进程使用的地址空间中找到安全的空白空间。

我不确定为内核保留的高内存地址是什么意思"。如果您在32位操作系统上谈论2G / 2G或3G / 1G拆分,那么这是使用它的那些操作系统的基本设计元素。它不会随版本而改变。

如果您正在谈论高物理内存,那么没有。编译器不关心物理内存。

答案 1 :(得分:1)

Linux为每个应用程序提供了自己的内存空间,与内核不同。页表包含此内存空间和物理RAM之间的转换,内核设置页表,因此没有干扰。

也就是说,编译器通常甚至不关心程序在内存中加载的位置。为什么会这样?