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 modeprotect mode 中编译/运行代码的主要区别。如果没有专门设置以利用protect mode,则默认为real mode,并具有所有传统限制。 可以,但是分段与真实和保护模式正交,对吗? 【参考方案1】:

在 64 位模式下没有段(感谢上帝!)。

英特尔领域的细分一直是一个杂项。

【讨论】:

那么您能解释一下 64 位编译代码的不同部分存储在哪里吗?代码去哪儿了?堆栈变量呢?和堆?我也遇到了这个线程:reverseengineering.stackexchange.com/questions/2006/… 它说 windows x64 仍然使用 GS 寄存器来执行线程特定的任务。如果把整个内存都当成“平坦的”,理论上代码可以与数据和栈变量交错吗? 操作系统设定了界限。链接器通常做出最终决定。请记住,自 1970 年代以来,除 Intel 之外的几乎所有系统都有平面内存模型。 好的。因此,如果我理解正确,这些边界定义了投票各个部分的各个部分,对吗?所以从本质上讲,即使他们可能不这么称呼它,它是否仍在使用分段?如果它是一个完全扁平的模型,我不应该可以混合代码、堆栈数据和堆数据吗? 您可能想采取不同的观点。程序段通常是以下属性的组合:可执行/可读/可写。链接器将根据这些术语对程序的段进行分组。对于程序的静态区域,链接器通常将相似的区域保持在一起。在前线程时代,堆栈通常位于用户地址空间的最高区域,以便它可以向下增长。使用线程,一个进程可以有多个堆栈,因此它们必须分开。堆通常位于链接器的静态数据和堆栈之间。 在细分模型中,属性处于细分级别。在平面模型中,它们是在每页级别上完成的。链接器通常将相似的页面组合成程序段。页面保护是一种比分段保护更灵活的系统。

以上是关于64 位 Intel(和非 Intel)处理器中的分段的主要内容,如果未能解决你的问题,请参考以下文章

intel i处理器有哪几种架构,三个等级有啥区别?

是否可以在支持Intel IA-32e模式的操作系统中运行16位代码?

求32位win 7系统Intel HD Graphics 630显卡驱动

如何在没有隐式锁定最新的64位Intel CPU的情况下用寄存器交换堆栈顶部?

Yasm 使用 intel 语法编译 64 位代码

intel等处理器 介绍