詳解Linux作業系統裝置驅動相容性(轉)

BSDLite發表於2007-08-16
詳解Linux作業系統裝置驅動相容性(轉)[@more@]  最新進展

  Linux一直在迅速地發展著,開發人員總是迫切希望改善核心內部,它們並不考慮向後相容性。這種自由開發導致了不同版本核心提供的裝置驅動程式介面之間一定程度的不相容。不過,在應用級還保持著相容,除了個別需要與核心特徵進行低階互動的應用(象ps)。

  另一方面,裝置驅動程式是直接連結到核心映象上的,因此必須與資料結構、全域性變數、以及由內系統引出的函式發生的改變保持一致。在開發過程中,隨著新特徵的加入,內部被修改;新的實現取代了就的實現,因為實踐證明它們更快,更清晰。儘管不相容性要求程式設計師在寫模組時要做一些額外的工作,我認為連續的開發是Linux社群的成功點:嚴格的先後相容性最終證明是有害的。

  這一章講述2.0.x和2.1.43之間的不同,這些將會與即將推出的2.2釋出類似。Linus在前幾個2.1版本中引入了最重要的改變,這樣核心就可以多經歷幾個2.1版本,使得驅動程式的作者有足夠的時間在開發被鎖定以釋出穩定的2.2之前來穩定驅動程式。下面的小節介紹驅動程式是如何處理2.0和2.1.43之間的不同的。我已經修改了本書介紹的所有示例程式碼,使得它們可以同時在2.0和2.1.43上編譯和執行,以及這之間的大多數版本。驅動程式的新版本可以從O’Reilly的FTP站點上線上例子的v2.1目錄下得到。2.0和2.1之間的相容性透過標頭檔案sysdep-2.1.h獲得,它可以與你自己的模組整合。我選擇不把相容性擴充套件到1.2避免了給C程式碼載入太多的條件,而且1.2-2.0的不同已經在前面的章節解釋過了。在我將要寫完這本書時,我瞭解到從2.1.43起又引入了一些小的不相容性;我不打算對之加以評述,因為我不能保證對這些最新版本的完全支援。

  注意在本章我不會講述2.1開發系列引入的所有新東西。我要做的只是移植2.0模組,使之可以在2.0和2.1核心上執行。利用2.1的特徵意味著放棄對不具有這些特徵的2.0釋出的支援。2.0版本仍是本書的重點。在寫sysdep-2.1.h時,我已努力使你熟悉新的API,我引入的宏用來使2.1的程式碼可以在2.0上跑,而不是相反。

  本章以重要性逐漸降低的順序介紹不相容性;最重要的不同首先被介紹,次要的細節則在後面介紹。

  模組化

  在Linux社群中,模組化變的越來越重要,開發人員決定用一個更清晰的實現取代舊的。標頭檔案在2.1.18中完全重寫了,一個新的API被引入。如你所期望的,新的實現比舊的要容易使用。為了載入你的模組,你將需要包modutils-2.1.34甚至更新版本(細節見Documentation/

  Changes)。當與舊的核心一起使用時,這個包可以回到相容模式,因此你可以用這個新包替換modules-2.0.0,即使你經常在2.0和2.1之間切換。

  引出符號

  符號表的新介面比以前的要容易多了,它依賴於下面的宏:

  EXPORT_NO_SYMBOLS;這個宏與register_symtab(NULL)等價;它可以出現在一個函式的內部或外部,因為它只是指導彙編器,而不產生實際程式碼。如果你想在Linux2.0上編譯模組,這個宏應該在init_module中被使用。

  EXPORT_SYMTAB;如果你打算引出一些符號,那麼模組必須在包含之前定義這個宏。

  EXPORT_SYMBOL(name);這個宏表明你想引出這個符號名。它必須在任何函式之外使用。

  EXPORT_SYMBOL_NOVERS(name)使用這個宏而不是EXPORT_SYMBOL()強制丟棄版本資訊,即使是編譯帶有版本支援的程式碼。這對避免一些不必要的重編譯很有用。例如,memset函式將總以同樣的方式工作;引出符號而不帶版本資訊允許開發者改變實現(甚至使用的資料型別)而不需insmod標出不相容性。在模組化的程式碼中不大可能需要這個宏。

  如果這些宏都沒有在你的原始碼中使用,那麼所有的非靜態符號都被引出;這與在2.0中一如果這些宏都沒有在你的原始碼中使用,那麼所有的非靜態符號都被引出;這與在2.0中一樣。如果這個模組是從幾個原始檔生成的,你可以從任何原始檔引出符號,而且還可以在模組的範圍中共享任何符號。如你所看到的,引出符號表的新方法解決了一些問題,但這個創新也引入了一個重要的不相容性:一個引出了一些符號的模組,如果想同時在2.0和2.1上編譯執行,則必須用條件編譯來包含兩個實現。下面是export模組(v2.1/misc-modules/export.c)如何處理這個問題的當使用2.1.18或更新的核心時,REGISTER_SYMTAB擴充套件為什麼都不做,因為init_module中沒有什麼需要做的;在函式外使用EXPORT_SYMBOL是引出模組符號唯一需要做的。

  宣告引數

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-960648/,如需轉載,請註明出處,否則將追究法律責任。

相關文章