Pointers 64位Intel(和非Intel)处理器中的分段

Pointers 64位Intel(和非Intel)处理器中的分段,pointers,memory,paging,virtual-memory,segments,Pointers,Memory,Paging,Virtual Memory,Segments,我试图理解64位体系结构中进程段的实现。我遇到了以下两个讨论: 不过,我仍然不清楚。在Intel 80286/80386中,引入分段是为了克服使用16位地址的64K内存的限制。在那之后,32位的英特尔机器出于兼容性的原因仍然继续使用它 现在转到64位:手册说这里很少实现分段(参考:)。虚拟内存和分页可以提供对整个地址空间的访问和保护 所以我的问题是:64位编译器是如何编译64位程序的?他们是否仍然像以前一样使用“段”的概念(因为我仍然看到提到数据段、堆栈段等),但使用更高位的段指针?或者,对

我试图理解64位体系结构中进程段的实现。我遇到了以下两个讨论:

不过,我仍然不清楚。在Intel 80286/80386中,引入分段是为了克服使用16位地址的64K内存的限制。在那之后,32位的英特尔机器出于兼容性的原因仍然继续使用它

现在转到64位:手册说这里很少实现分段(参考:)。虚拟内存和分页可以提供对整个地址空间的访问和保护

所以我的问题是:64位编译器是如何编译64位程序的?他们是否仍然像以前一样使用“段”的概念(因为我仍然看到提到数据段、堆栈段等),但使用更高位的段指针?或者,对于64位体系结构,“段”一词指的是完全不同的东西吗


感谢您的帮助。

64位模式下没有任何段(感谢上帝!)


“英特尔土地”中的分段一直是个难题。

我没有重新阅读您提供的链接,但如果我没有记错的话,这是在
实模式
保护模式
下编译/运行代码的主要区别。如果没有特别设置为利用
保护模式
的优势,则默认为
实模式
,具有所有传统限制。当然,但分段与实模式和保护模式正交,正确吗?那么您能否解释一下64位编译代码的不同部分存储在何处?代码在哪里?堆栈变量呢?那堆呢?我也遇到过这个线程:它说Windowsx64仍然使用GS寄存器来执行特定于线程的任务。如果将整个内存视为“平面”,那么理论上代码可以与数据和堆栈变量交错吗?操作系统设置边界。链接者通常做出最终决定。请记住,自20世纪70年代以来,除英特尔外,几乎所有系统都有一个平面内存模型。Ok。如果我理解正确的话,这些边界定义了投票权各个部分的各个部分?所以,在本质上,即使他们可能不这么称呼它,它不是仍然在使用分段吗?如果它是一个完全扁平的模型,我是否应该能够混合使用代码、堆栈数据和堆数据(如果我愿意的话)?您可能需要采取不同的观点。程序段通常是以下属性的组合:可执行/可读/可写。链接器将根据这些术语对程序段进行分组。对于程序的静态区域,链接器通常将相似区域保持在一起。在线程前的日子里,堆栈通常位于用户地址空间的最高区域,以便向下增长。对于线程,一个进程可以有多个堆栈,因此它们必须隔开。堆通常位于链接器的静态数据和堆栈之间。在段模型中,属性位于段级别。在平面模型中,它们是在每页级别上完成的。链接器通常将相似的页面分组到程序段中。页面保护是一种比段保护更灵活的系统。