Linux內核升級後,我的VMWare服務器無法啓動,直到使用vmware-config.pl進行一些重新配置工作(包括構建一些內核模塊)。爲什麼我需要在Linux內核升級後重新編譯vmware內核模塊?
如果我用最新的Windows Service Pack更新我的Windows VMWare主機,我通常不需要做任何事情來運行VMWare。
爲什麼VMWare在Linux和Windows之間的工作方式不同?這種重新編譯行爲是否會在Windows平臺上帶來任何好處?
Linux內核升級後,我的VMWare服務器無法啓動,直到使用vmware-config.pl進行一些重新配置工作(包括構建一些內核模塊)。爲什麼我需要在Linux內核升級後重新編譯vmware內核模塊?
如果我用最新的Windows Service Pack更新我的Windows VMWare主機,我通常不需要做任何事情來運行VMWare。
爲什麼VMWare在Linux和Windows之間的工作方式不同?這種重新編譯行爲是否會在Windows平臺上帶來任何好處?
閱讀The Linux Kernel Driver Interface。
這是爲了解釋爲什麼Linux沒有二進制內核接口,也沒有穩定的內核接口。請認識到,本文描述_in kernel_ interfaces,而不是用戶空間接口的內核。用戶空間接口的內核是應用程序使用的接口,即系統調用接口。該界面隨着時間的推移非常穩定,並且不會中斷。我有一些以前的0.9s內核構建的程序,在最新的2.6內核版本上仍然可以正常工作。這個接口是用戶和應用程序員可以依賴的穩定接口。
它反映的Linux內核開發者很大一部分的觀點: 自由在任何時候更改內核實施細則和API使他們能夠更快,更好地發展。如果沒有保證內核接口在發行版本之間相同的承諾,VMWare的二進制內核模塊無法可靠地在多個內核上工作。例如,如果某個結構在新內核版本上發生變化(爲了獲得更好的性能或更多功能或其他原因),二進制VMWare模塊可能會使用舊的結構佈局造成災難性的損壞。從源代碼再次編譯模塊將捕獲新的結構佈局,因此可以更好地工作 - 儘管仍然不是100%,以防字段被刪除,重命名或賦予不同的目的。
如果某個函數改變了它的參數列表,或者被重命名或以其他方式不再可用,甚至不會從相同的源代碼重新編譯。該模塊將不得不適應新的內核。由於每個人(應該)都有源並且(可以找到某個人)能夠修改它以適應。「向終端節點推送工作」是網絡和自由軟件中的一個普遍想法:由於Linux內核之外的開發人員的資源大於[骨幹]/[ [Linux開發者],讓前者承擔更多工作的權衡是可以接受的。另一方面,微軟已經決定儘可能地保留二進制驅動程序的兼容性 - 他們沒有選擇,因爲他們在專有世界中玩耍。從某種意義上說,這對於不再面對移動目標的外部開發人員以及對於永遠不需要改變任何內容的最終用戶來說更容易。不利的一面是,這會迫使微軟保持向後兼容性,這對微軟的開發人員來說(最好)是耗時的,並且(最壞的情況下)效率低下,導致錯誤並且阻止向前發展。
Linux沒有穩定的內核ABI - 像數據結構的內部佈局等事情從一個版本變爲另一個版本。 VMWare需要重建以在新內核中使用ABI。
另一方面,Windows有一個非常穩定的內核ABI,不會從Service Pack更改爲Service Pack。
要增加到bdonlan的答案,ABI兼容性是一個混雜的包。一方面,它允許您分發二進制模塊和驅動程序,這些模塊和驅動程序將與新版本的內核一起工作。另一方面,它迫使內核程序員添加大量膠水代碼以保持向後兼容性。由於Linux是開源的,並且由於kernel developers even whether they're even allowed,分發二進制模塊的能力並不被認爲是重要的。另一方面,Linux內核開發人員在改變數據結構以改善內核時不必擔心ABI兼容性問題。從長遠來看,這會導致更乾淨的內核代碼。
這是Linux和Windows在不同文化環境和期望下開發的結果:http://www.joelonsoftware.com/articles/Biculturalism.html。簡而言之:Windows旨在適合用戶,而Linux則適合開源開發人員。