C语言 编译器在布局内存时是否考虑内核内存空间



我正在尝试调和几个概念。

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

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

还是我混淆了不同的概念?在浏览本教程时,我有点困惑,特别是在底部,它的操作系统代码在低内存地址,因为我认为Linux使用高内存内核。

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

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

操作系统加载器知道在哪里加载东西。以及操作系统的虚拟内存分配逻辑如何在进程使用的地址空间中找到安全的、空的空间。

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

如果你说的是高物理内存,那么没有。编译器不关心物理内存

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

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

最新更新