簡體   English   中英

為什么我需要在linux內核升級后重新編譯vmware內核模塊?

[英]Why I need to re-compile vmware kernel module after a linux kernel upgrade?

在Linux內核升級之后,我的VMWare服務器無法啟動,直到使用vmware-config.pl進行一些重新配置工作(包括構建一些內核模塊)。

如果我用最新的Windows Service Pack更新我的Windows VMWare主機,我通常不需要做任何事情來運行VMWare。

為什么VMWare在Linux和Windows之間的工作方式不同? 這種重新編譯操作是否會通過Windows在Linux平台上帶來任何好處?

閱讀Linux內核驅動程序接口

編寫本文是為了解釋為什么Linux沒有二進制內核接口,也沒有穩定的內核接口。 請注意,本文描述了_in kernel_接口,而不是用戶空間接口的內核。 內核到用戶空間接口是應用程序使用的接口,即syscall接口。 隨着時間的推移,該接口是非常穩定的,並且不會破壞。 我有一些基於0.9something內核的舊程序,在最新的2.6內核版本上仍能正常工作。 該接口是用戶和應用程序員可以指望穩定的接口。

它反映了大部分Linux內核開發人員的觀點:隨時改變內核實現細節和API的自由度使他們能夠更快更好地開發。

如果沒有承諾在發行版之間保持內核接口相同,那么像VMWare這樣的二進制內核模塊就無法在多個內核上可靠地工作。

例如,如果某個結構在新內核版本上發生更改(為了獲得更好的性能或更多功能或其他原因),二進制VMWare模塊可能會使用舊的結構布局造成災難性損壞。 從源代碼再次編譯模塊將捕獲新的結構布局,因此更好的工作機會 - 盡管仍然不是100%,以防已刪除或重命名字段或給出不同的目的。

如果函數更改其參數列表,或者重命名或以其他方式不再可用,則甚至不能從相同的源代碼重新編譯。 該模塊必須適應新內核。 因為每個人(應該)都有源和(可以找到某人)能夠修改它以適應。 “將工作推送到終端節點”是網絡和自由軟件中的一個常見想法:因為[在Linux內核以外的開發人員] [[邊緣] / [資源]的資源大於[骨干]的有限資源/ [Linux開發人員],權衡使前者做更多的工作被接受。

另一方面,微軟決定盡可能保持二進制驅動程序兼容性 - 他們別無選擇,因為他們正在一個專有的世界中玩。 在某種程度上,這使得不再面臨移動目標的外部開發人員以及從不必更改任何內容的最終用戶更容易。 在不利方面,這迫使微軟保持向后兼容性,這對微軟的開發人員來說(充其量)是耗時的,並且(在最壞的情況下)效率低下,導致錯誤,並阻止前進。

Linux沒有穩定的內核ABI - 像數據結構的內部布局等等,從版本變為版本。 需要重建VMWare才能在新內核中使用ABI。

另一方面,Windows有一個非常穩定的內核ABI,它不會從Service Pack更改為Service Pack。

這是Linux和Windows在不同文化環境和期望中開發的結果: http//www.joelonsoftware.com/articles/Biculturalism.html 簡而言之:Windows旨在適合用戶,而Linux則適合開源開發人員。

為了增加bdonlan的答案,ABI兼容性是一個混合包。 一方面,它允許您分發二進制模塊和驅動程序,這些模塊和驅動程序將與更新版本的內核一起使用。 另一方面,它迫使內核程序員添加大量的粘合代碼以保持向后兼容性。 因為Linux是開源的,並且因為內核開發人員甚至是否允許它們 ,所以分發二進制模塊的能力並不重要。 從好的方面來說,Linux內核開發人員在改變數據結構以改進內核時不必擔心ABI兼容性。 從長遠來看,這會產生更清晰的內核代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM