我试着调和几个概念。
我知道虚拟内存在内核和所有用户进程之间共享(映射),我读过这里。我还知道,当编译器为代码+数据生成地址时,内核必须将它们加载到该进程的正确虚拟地址。
为了限制问题的范围,当我提到“编译器”时,我的意思是gcc。那么编译器是否需要兼容操作系统的每一个新版本,以避免将代码或数据放置在为内核保留的高内存地址中?就像这样,编写编译器的人必须知道内核计划如何加载程序的那些细节(以免编译器将可执行代码放入高内存)?
还是我混淆了不同的概念?在浏览本教程时,我感到有点困惑,特别是在底层,它在低内存地址中有操作系统代码,因为我认为Linux在内核中使用高内存。
发布于 2016-06-23 20:18:05
编译器不确定内存中放置东西的地址范围。由操作系统来处理。
当程序第一次执行时,加载程序将程序的各个部分及其库放置在内存中。对于动态分配的内存,从操作系统中分配大块,有时将其划分为较小的块。
操作系统加载程序知道在哪里加载东西。以及操作系统的虚拟内存分配逻辑,如何在进程使用的地址空间中找到安全、空的空间。
我不知道您所说的“为内核保留的高内存地址”是什么意思。如果你说的是32位操作系统上的2G/2G或3G/1G分裂,这是使用它的OSes的基本设计元素。它不会随版本而改变。
如果你说的是高的物理记忆,那就不是。编译器不关心物理内存。
发布于 2016-06-23 20:12:31
Linux为每个应用程序提供了自己的内存空间,与内核不同。页面表包含内存空间和物理RAM之间的转换,内核设置页面表,这样就不会有任何干扰。
也就是说,编译器通常并不关心程序在内存中的位置。为什么要这么做?
https://stackoverflow.com/questions/38000863
复制相似问题