歡迎您光臨本站 註冊首頁

詳解Linux操作系統設備驅動兼容性

←手機掃碼閱讀     火星人 @ 2014-03-25 , reply:0

  最新進展

  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是引出模塊符號唯一需要做的。

  聲明參數

[火星人 ] 詳解Linux操作系統設備驅動兼容性已經有172次圍觀

http://coctec.com/docs/linux/show-post-155336.html