2014-02-24 162 views
3

我對這個主題感到陌生,所以原諒我的無知?不同體系結構的操作系統彙編語言

我剛開始在我的linux系統上學習x86處理器的程序集。我寫了一個簡單的引導程序,它可以工作,但是特定於x86。我也明白寄存器等對於intel和amd或32位和64位是非常不同的。那麼如何在同一時間爲各種體系結構編寫一個操作系統或應用程序。是的應用程序是特定於操作系統的,但是它們不應該是CPU特有的。就像它們被編譯成機器代碼時一樣,它們需要用於一種類型的處理器(因爲不同架構的寄存器等不同)?那麼他們如何做到這一點?

還是有可能所有的x86都有公共寄存器和指令集,如athlon,pentium, i3,i5等,它只是在x86和64位架構不同?

+0

如今許多當前的處理器仍然可以處理x86程序,即使它們的體系結構是x64,如果您打算在x64和x86上製作軟件,請將其轉換爲x86體系結構。 –

回答

0

你說的最後是正確的 - 所有的x86都有一套通用的指令,雖然它在引擎蓋下做的細節顯然是非常不同的。例如,在英特爾硬件上,實際上有隱藏的寄存器,x86彙編指令實際上無法訪問。

的操作系統被寫入組件將需要爲不同的體系結構不同的彙編指令的部件(86 VS PPC VS ARM等...)

被用C語言編寫的操作系統的部分可以也有一些差異,例如,當移動到x64時,您不能再假定指針是4個字節。爲了處理C級別的這些差異,代碼通常會使用大量的#ifdefs來處理差異。

這當然是一個非常大的話題,上面只是一個非常概括的概述。

+0

x86中的x有一些歷史記錄 - 最初是8086指令集。然後80186,80286,80386等......每一套都引入了新的功能。例如80386引入了32位寄存器。 該指令集旨在向後兼容。在8到16到32到64位的情況下,寄存器名稱保持「增長」 rax是64位寄存器,eax是低32位,ax是低16位,al是低8位。這樣x86指令使用eax仍然可以在x64 CPU上工作 – thisisdog

+0

謝謝..隨着組裝事情變得更清晰的內部工作......一直在嘗試高級語言但不知道到現在爲止發生了什麼..再次感謝 – MYNE

+0

在彙編編碼中有代碼16來使代碼16位。那麼這是什麼告訴處理器使用哪種體系結構,如16位或32位或64位?像我們不能混合使用這兩種權利? – MYNE

0

當您開始查看底層代碼(例如引導代碼,內核等)時,高級語言代碼可移植的想法是無稽之談。有很多不同的CPU需要不同的代碼,但沒有高級語言支持。這包括切換CPU模式,設置分頁,存儲/加載任務狀態(在任務切換期間)等。

要解決此問題,最終使用非可移植代碼(assembly)。對於內核代碼,這通常意味着使用諸如條件代碼之類的東西(例如#ifdef i386)並且將不可移植的部分轉換爲特殊的(CPU /架構特定的)目錄;因此大部分代碼都是可移植的(但是對於不同的情況,必須重新編寫一小部分代碼)。

這同樣適用於啓動代碼;但是在這裏它會變得更加混亂,因爲對於完全相同的CPU,可能有幾種不同的「預引導環境」(例如BIOS和UEFI)。我認爲每個人都以各自不同的方式處理這個問題。

請注意,80x86具有「歷史相關」寄存器和指令集。這並不意味着相同的代碼可以在所有80x86 CPU上工作(或者甚至是不同模式下的相同CPU)。有幾種模式(主要是16位,32位和64位)需要不同的代碼,然後有幾個擴展(3DNow,MMX,SSE,AVX),可以添加額外的寄存器,可能存在也可能不存在。還有一部分CPU(例如性能監控)是「特定型號」。

+0

PC的引導代碼以16位實模式運行,但在指令上使用前綴根據需要獲取32位操作數。幾年前,BIOS要求磁盤I/O擴展爲使用64位地址作爲扇區地址,但它仍然處於16位模式,所以必須在前1 MB內存中讀取數據。有一個BIOS調用切換到保護模式,該模式需要指向X86特定的表來執行此操作,這將切換到32位或64位保護模式。 – rcgldr

+0

@rcgldr:沒有人使用過這個BIOS功能(你自己更容易做模式切換),它永遠不會支持64位(這需要分頁)。具有UEFI的PC的啓動代碼通常是64位代碼(但對於較早的32位UEFI系統,則需要32位代碼)。 BIOS目前已被棄用;但即使對於BIOS,通常您也會在BIOS功能中使用「thunking wrapper」,這樣您就可以在大多數啓動代碼中使用32位保護模式。 – Brendan

+0

「BIOS目前已被棄用」 - 當前操作系統可能不使用BIOS功能切換到保護模式,但我不知道SATA,USB軟盤或網絡設備的標準編程接口,所以如何是在啓動時爲這些設備執行的I/O而不使用BIOS? – rcgldr