首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >编译器在布局内存时是否考虑了内核内存空间?

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

Stack Overflow用户
提问于 2016-06-23 20:05:57
回答 2查看 148关注 0票数 1

我试着调和几个概念。

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-23 20:18:05

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

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

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

我不知道您所说的“为内核保留的高内存地址”是什么意思。如果你说的是32位操作系统上的2G/2G或3G/1G分裂,这是使用它的OSes的基本设计元素。它不会随版本而改变。

如果你说的是高的物理记忆,那就不是。编译器不关心物理内存。

票数 2
EN

Stack Overflow用户

发布于 2016-06-23 20:12:31

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38000863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档