2011-06-10 83 views
6

從過去的讀數看來似乎大多數 32位驅動程序將無法在64位上工作。爲什麼32位驅動程序不能在64位上工作

在純粹的概念層面上,我發現64位機器在使用32位驅動程序時有額外的「空間」,因此我試圖確定爲什麼他們最經常會使用而不是。 (我從用戶空間來)

我已閱讀this維基文章X86-64其中規定

push和pop堆棧上總是在8字節的進步,和指針8個字節寬。

我可以看到這可能是一個32位驅動程序可能在64位上失敗的原因,因爲它發出一個pop(),其中彈出的數據是驅動程序預期的兩倍。

我剛剛提到的可能完全不符合標準,因爲我是一個用戶空間的人,在這種情況下,或者其他方式,什麼是一些實際的例子(代碼或外行人的解釋)爲什麼32位驅動程序在運行時失敗在64位?

回答

6

簡而言之,你不能在一個32位指針中存儲一個64位地址。因此,如果您的代碼涉及將指針傳遞到操作系統,正如設備驅動程序通常所做的那樣,它不會很好地結束。

驅動程序通常是關於在財政設備(例如磁盤)和內存之間移動數據。驅動程序將被要求在地址Y處將X磁盤扇區傳輸到內存中。

在64位操作系統上,Y將是64位地址,因此您的32位驅動程序無法處理此問題。當然,還有一個問題是指針傳遞的大小是它期望的兩倍,所以如果它運行DID,它可能會戳錯所有錯誤的內存......

+0

,所以驅動程序可能會要求一些內存分配,操作系統將返回一個地址,它(驅動程序)無法解決/指向? – wal 2011-06-10 14:52:36

+0

@wal。是的,但更簡單的事情出錯了,如上所述。 – Roddy 2011-06-10 14:57:51

4

請記住,司機在那裏與硬件交談。如果將32位驅動程序代碼加載到遠離硬件memory-mapped registers所在位置超過4千兆字節的內存區域,該怎麼辦?驅動程序代碼將在內存中塗寫,與本身或它應該驅動的硬件無關。

+0

如果驅動程序被標記爲(不知何故)爲32位,並且只加載到小於4gig的地址中,那麼票價如何? – wal 2011-06-10 14:45:44

+0

32位代碼仍然會以32位模式運行。它不會神奇地轉換成64位模式。這與在32位386+處理器上以虛擬86模式運行的16位代碼基本相同。整體環境是64位,但32位部分運行在32位沙箱中。 – 2011-06-10 14:47:04

+0

當然,但它仍然會運行。 (都在32位模式下) – wal 2011-06-10 14:50:09

0

x86-64處理器無法在特權(內核)模式下運行32位代碼。兼容模式僅適用於用戶空間。

+0

實際上,他們可以並且已經在MacOS X 10.5中進行實踐,儘管您運行的是64位應用程序(沒有仿真),但內核是32位的。 – LocoDelAssembly 2011-06-12 06:00:48

+1

他們正在運行一個32位內核,並在用戶空間切換到64位。這與在64位內核中運行32位驅動程序不同。 – 2011-06-12 12:00:56

0

我的2美分價值。微軟並沒有對老鼠發佈升級或補丁時造成的混亂情況。

特別是關於傳統硬件與x64代OS兼容。 我在這裏談論無數的科學硬件,那裏只有32位驅動程序,硬件無法獲得和不再支持,從而使實驗室運行XP或至多7 x86。同樣,消費者如何購買生物識別掃描儀和各種醫療設備。

x64路徑的設計應該適應傳統的32位硬件。

相關問題