2012-08-04 161 views
1

基本上,我想知道的是,x86-64操作系統如何運行爲x86機器編譯的代碼。我知道第一個x64系統何時推出,這不是它們中的任何一個的特徵。之後,他們設法做到了這一點。x64操作系統如何運行爲x86機器編譯的代碼

請注意,我知道x86彙編語言是x86-64彙編語言的一個子集,ISA的設計方式可以支持向後兼容性。但是,這裏讓我困惑的是堆棧調用約定。這些約定根據架構而有很大差異。例如,在x86中,爲了備份幀指針,進程將其指向堆棧(RAM)的位置並在完成後彈出。另一方面,在x86-64中,進程不需要更新幀指針,因爲所有的引用都是通過堆棧指針給出的。其次,在x86架構中,函數參數在x86-64中通過堆棧傳遞,寄存器用於此目的。

x86-64和x64架構的堆棧調用約定之間的差異可能不會影響程序堆棧增長的方式,只要不同的約定不會同時使用,這種情況大多是這種情況,因爲x32函數被調用其他x32和x64相同。但是,在某一點上,一個函數(可能是一個系統函數)會調用一個函數,該函數的代碼是用一些參數爲一個x86-64機器編譯的,在這一點上,我很好奇OS(或其他控制單元)如何處理讓這個功能起作用。

在此先感謝。

回答

3

部分原因是CS和其他段寄存器指條目在GDT。 GDT條目除了描述當前運行任務的操作模式和特權級別的基數和限制之外,還有一些特殊位。

如果CS寄存器引用32位的code segment,則處理器將運行在本質上爲i386兼容模式。同樣,64位代碼需要64位代碼段。

所以,把這一切放在一起。

當操作系統想要運行32位任務時,在任務切換期間,它將一個值加載到CS中,該值指向一個32位代碼段。中斷處理程序還具有與它們關聯的段寄存器,所以當發生系統調用或發生中斷時,處理程序將切換回OS的64位代碼段(允許64位操作系統代碼正常運行)以及操作系統然後可以開展工作並繼續安排新的任務。

作爲跟進調用約定。 i386或x86-64 都不要求使用幀指針。代碼可以隨心所欲地執行。實際上,許多編譯器(gcc,clang,VS)都提供了在沒有幀指針的情況下編譯32位代碼的功能。什麼重要的是調用約定是一致實施的。如果所有的代碼都希望參數在堆棧上傳遞,那很好,但被調用的代碼更好地同意這一點。同樣,通過寄存器傳遞也沒問題,只是每個人都必須同意(至少在圖書館界面層面,內部功能通常可以按照他們的意願進行)。

除此之外,請記住,兩者之間的差異並不是真正的問題,因爲每個進程都有自己的內存視圖。然而,一個側面的結果是,32位應用程序無法加載64位dll,而64位應用程序無法加載32位dll,因爲進程要麼具有32位代碼段,要麼具有64位代碼分割。它不能兼而有之。

+0

感謝您提供全面和明確的答案。 x86指令(利用32位寄存器 - eax,ebx等)可以在64位進程中執行嗎?例如:在'mov eax,[ecx]'指令中,'ecx'的值將被視爲32位地址,但由於進程是64位的,我認爲它可以引用僅限64位內存空間。理論上,這個指令是否應該在64位進程中可執行? – Bliss 2017-06-15 20:41:06

+0

@Bliss,所有的32位寄存器都可以在64位模式下完全訪問。 – 2017-06-15 21:24:34

+1

至於32位寄存器,你當然需要小心,因爲地址將被擴展爲64位,你並不想用32位地址來指代高於4GB標記的地址。儘管如此,使用相對尋址模式很大程度上不會引起關注 – 2017-06-15 21:26:59

1

處理器進入傳統模式,但那時需要執行的所有內容都是32位代碼。該切換由OS處理。

Windows:它使用WoW64。 WoW64負責改變處理器模式,它還提供兼容的dll和註冊表功能。 Linux:直到最近,當Linux開始執行32位代碼時,用於(比如windows)轉換到以傳統模式運行處理器,您需要安裝所有32位glibc庫,並且如果它試圖一起工作與64位代碼。現在正在實施X32 ABI這應該使所有的運行更平滑,並允許32位應用程序訪問x64功能,如增加no。的寄存器。 See this article on the x32 abi

PS:我不是很確定事情的細節,但它應該給你一個開始。

此外,這個答案與Evan Teran的答案相結合可能會給出所發生的一切的粗略畫面。的,所述的i386/x86-64架構的設計方式

+0

WOW64更多的是解決方案的API層的一部分(它是32位的dll,可安全地轉換爲64位系統調用)。它並沒有真正解決CPU級別的任何問題。 Hense缺乏「Windows 64上的Windows」。澄清一點,我稱它爲「虛擬化」,更多爲「抽象」,我並不認爲它是準確的。 – 2012-08-04 23:51:54

+0

在做了更多研究之後,更改了我的答案。你說得對,將其稱爲抽象層會好得多。 – Akshet 2012-08-05 00:12:08

+0

爲提高準確度+1 :-) – 2012-08-05 00:15:51

相關問題