2008-09-08 112 views
24

在我的OS X機器上,內核是一個32位的二進制文件,但它可以運行一個64位的二進制文件。 這是如何工作的?32位內核如何運行64位二進制文​​件?

 
cristi:~ diciu$ file ./a.out 
./a.out: Mach-O 64-bit executable x86_64 
cristi:~ diciu$ file /mach_kernel 
/mach_kernel: Mach-O universal binary with 2 architectures 
/mach_kernel (for architecture i386): Mach-O executable i386 
/mach_kernel (for architecture ppc): Mach-O executable ppc 
cristi:~ diciu$ ./a.out 
cristi:~ diciu$ echo $? 
1 
+0

[OSX在32位內核上運行時如何運行64位二進制文​​件?](https://superuser.com/q/340549/241386) – 2017-05-03 04:33:46

回答

43

CPU可以從64位執行模式切換到32位時,它捕獲到內核上下文,和一個32位內核仍然可以構造成理解來自64位用戶空間的應用通過在結構中。

的MacOS X的內核不直接取消引用從用戶應用程序的指針,無論如何,因爲它位於它自己獨立的地址空間。例如,ioctl調用中的用戶空間指針必須先解析爲其物理地址,然後在內核地址空間中創建新的虛擬地址。這個ioctl中的指針是64位還是32位並不重要,在這兩種情況下,內核都不直接解引用它。

所以混合了32位內核和64位二進制文​​件可以正常工作,並且反之亦然。你不能做的事情是混合32位庫和64位應用程序,因爲它們之間傳遞的指針會被截斷。 MacOS X在每個版本中都提供32位和64位版本的更多框架。

6

這不是運行二進制文件的內核。這是處理器。

的二進制文件沒有調用庫函數和那些需要是64位。如果他們需要進行系統調用,他們有責任應對這樣的事實,即他們自己是64位,但內核只有32位。

但是,這不是你不必擔心的。

0

對於內核爲64位只會帶來的有效優點,即內核擴展(即,通常的驅動程序)可以是64位。事實上,你需要擁有所有的64位內核擴展,或者(現在就是這樣)所有的32位內核擴展;它們需要是運行內核的體系結構本地的。

+0

只要有便宜的硬件需要便宜的第三方驅動程序,則不需要預計很快就會發生64位內核:-) – pilif 2008-09-08 15:33:23

+0

64位Windows需要64位驅動程序,並且內核以64位模式運行。您無法在64位Windows上運行32位驅動程序。上面的例子是OS X,它沒有單獨的32位和64位版本(只能在64位的32位內核上運行64位應用程序)。 – 2008-09-08 15:35:42

+0

NT和OSX都在微內核上運行,當消息傳遞時它們可以執行64位模式切換。它會減慢速度。 – 2008-09-26 18:15:35

2

能夠加載和運行64位二進制文​​件的32位內核必須有一些64位代碼來處理內存映射,程序加載和一些其他64位問題。

但是,調度程序和許多其他操作系統操作不需要在64位模式下工作以處理其他問題 - 它將處理器切換到32位模式並根據需要返回以處理驅動程序,任務,內存分配和映射,中斷等等。實際上,操作系統所做的大多數事情並不一定會在64位上執行更快的運行 - 操作系統並不是一個沉重的數據處理器,而那些是(流,磁盤I/O等)可能會轉換爲64位(無論如何,插件到操作系統)。

但裸內核本身可能不會任務切換得更快,等等,如果它是64位。

當大多數人仍在運行32位應用程序時,尤其如此,所以模式切換並不總是需要的,即使這是一個低開銷操作,也需要一些時間。

- 亞當

6

請注意,並非所有位內核能夠運行64位的處理。 Windows肯定沒有這個屬性,我從來沒有看到它在Linux上完成。

1

ELF32文件可以包含64位指令並以64位模式運行。唯一的事情是標題和符號的組織是32位格式。符號表偏移是32位。符號表項是32位寬的等等。包含64位代碼和32位代碼的文件可以將其自身暴露爲32位ELF文件,它使用64位的晶體管來進行其內部計算。 mach_kernel就是這樣一個可執行文件。它獲得的優點是32位驅動程序ELF可以鏈接到它。如果它將位於4GB以下的指針傳遞給其他鏈接的ELF二進制文件,它將會正常工作。

相關問題