2015-04-20 128 views
1

我想了解的过程段的64位架构的实现。我碰到这2讨论:分割的64位英特尔(和非英特尔)处理器

64 bit application: layout in memory

Process segments(stack,heap,data and code) are contiguous in memory?

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

现在移动到64位:该手册说,分割很少在这里实现(参考:http://en.wikipedia.org/wiki/X86_memory_segmentation)。虚拟内存和分页可以提供对整个地址空间的访问以及保护。

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

任何帮助表示赞赏。

+0

我没有重读过你提供的链接,但是如果我没有记错,这是编译/运行你的代码在“实模式”或“保护模式”之间的主要区别。如果没有专门设置以利用'保护模式',则默认为具有所有传统限制的“实模式”。 –

+0

当然,但分割正交于真实和保护模式正确吗? –

回答

0

有在64位模式下没有分段(THANK GOD!)。

分割英特尔土地一直是杂牌。

+0

那么你能解释一下64位编译代码的不同部分存储在哪里吗?代码在哪里?怎么样堆栈变量?和堆? 我也遇到过这个线程:http://reverseengineering.stackexchange.com/questions/2006/how-are-the-segment-registers-fs-gs-cs-ss-ds-es-used-in-linux 它说,Windows x64仍然使用GS寄存器执行线程特定的任务。如果整个存储器被视为“平坦”,那么理论上可以将代码与数据和堆栈变量交织在一起? –

+0

操作系统设置边界。链接器通常会做出最终决定。请记住,自20世纪70年代以来,除了英特尔之外,几乎所有系统都有一个平坦的内存模型 – user3344003

+0

好的。所以如果我理解正确的话,这些边界为投票的各个部分定义了不同的部分。所以从本质上讲,即使他们不会这样称呼它,它仍然不使用分段吗?如果它是一个完全平坦的模型,我是否应该能够混合代码,堆栈数据和堆数据(如果我想要的话)? –