64 位 Intel(和非 Intel)处理器中的分段
Posted
技术标签:
【中文标题】64 位 Intel(和非 Intel)处理器中的分段【英文标题】:Segmentation in 64-bit Intel (and non-Intel) processors 【发布时间】:2015-06-26 17:37:09 【问题描述】:我正在尝试了解 64 位架构中进程段的实现。我遇到了这两个讨论:
64 bit application: layout in memory
Process segments(stack,heap,data and code) are contiguous in memory?
但是,我仍然不清楚。在 Intel 80286/80386 时代,引入分段是为了克服使用 16 位地址的 64K 内存的限制。此后,出于兼容性原因,32 位 Intel 机器仍继续使用它。
现在转向 64 位:手册说这里很少实现分段(参考:http://en.wikipedia.org/wiki/X86_memory_segmentation)。虚拟内存和分页可以提供对整个地址空间的访问以及保护。
所以我的问题是:64 位编译器如何编译 64 位程序?他们是否仍然像以前一样使用“段”的概念(因为我仍然看到提到数据段、堆栈段等),但使用更高的#位段指针?或者,“segment”这个词是指与 64 位架构完全不同的东西吗?
感谢任何帮助。
【问题讨论】:
我没有重新阅读您提供的链接,但如果我没记错的话,这是在real mode
或 protect mode
中编译/运行代码的主要区别。如果没有专门设置以利用protect mode
,则默认为real mode
,并具有所有传统限制。
可以,但是分段与真实和保护模式正交,对吗?
【参考方案1】:
在 64 位模式下没有段(感谢上帝!)。
英特尔领域的细分一直是一个杂项。
【讨论】:
那么您能解释一下 64 位编译代码的不同部分存储在哪里吗?代码去哪儿了?堆栈变量呢?和堆?我也遇到了这个线程:reverseengineering.stackexchange.com/questions/2006/… 它说 windows x64 仍然使用 GS 寄存器来执行线程特定的任务。如果把整个内存都当成“平坦的”,理论上代码可以与数据和栈变量交错吗? 操作系统设定了界限。链接器通常做出最终决定。请记住,自 1970 年代以来,除 Intel 之外的几乎所有系统都有平面内存模型。 好的。因此,如果我理解正确,这些边界定义了投票各个部分的各个部分,对吗?所以从本质上讲,即使他们可能不这么称呼它,它是否仍在使用分段?如果它是一个完全扁平的模型,我不应该可以混合代码、堆栈数据和堆数据吗? 您可能想采取不同的观点。程序段通常是以下属性的组合:可执行/可读/可写。链接器将根据这些术语对程序的段进行分组。对于程序的静态区域,链接器通常将相似的区域保持在一起。在前线程时代,堆栈通常位于用户地址空间的最高区域,以便它可以向下增长。使用线程,一个进程可以有多个堆栈,因此它们必须分开。堆通常位于链接器的静态数据和堆栈之间。 在细分模型中,属性处于细分级别。在平面模型中,它们是在每页级别上完成的。链接器通常将相似的页面组合成程序段。页面保护是一种比分段保护更灵活的系统。以上是关于64 位 Intel(和非 Intel)处理器中的分段的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在支持Intel IA-32e模式的操作系统中运行16位代码?
求32位win 7系统Intel HD Graphics 630显卡驱动