2015-04-20 188 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

好的。所以如果我理解正確的話,這些邊界爲投票的各個部分定義了不同的部分。所以從本質上講,即使他們不會這樣稱呼它,它仍然不使用分段嗎?如果它是一個完全平坦的模型,我是否應該能夠混合代碼,堆棧數據和堆數據(如果我想要的話)? –