2.3. 內(nèi)核模塊相比于應(yīng)用程序

2018-02-24 15:49 更新

2.3.?內(nèi)核模塊相比于應(yīng)用程序

在我們深入之前, 有必要強(qiáng)調(diào)一下內(nèi)核模塊和應(yīng)用程序之間的各種不同.

不同于大部分的小的和中型的應(yīng)用程序從頭至尾處理一個單個任務(wù), 每個內(nèi)核模塊只注冊自己以便來服務(wù)將來的請求, 并且它的初始化函數(shù)立刻終止. 換句話說, 模塊初始化函數(shù)的任務(wù)是為以后調(diào)用模塊的函數(shù)做準(zhǔn)備; 好像是模塊說, " 我在這里, 這是我能做的."模塊的退出函數(shù)( 例子里是 hello_exit )就在模塊被卸載時(shí)調(diào)用. 它好像告訴內(nèi)核, "我不再在那里了, 不要要求我做任何事了."這種編程的方法類似于事件驅(qū)動的編程, 但是雖然不是所有的應(yīng)用程序都是事件驅(qū)動的, 每個內(nèi)核模塊都是. 另外一個主要的不同, 在事件驅(qū)動的應(yīng)用程序和內(nèi)核代碼之間, 是退出函數(shù): 一個終止的應(yīng)用程序可以在釋放資源方面懶惰, 或者完全不做清理工作, 但是模塊的退出函數(shù)必須小心恢復(fù)每個由初始化函數(shù)建立的東西, 否則會保留一些東西直到系統(tǒng)重啟.

偶然地, 卸載模塊的能力是你將最欣賞的模塊化的其中一個特色, 因?yàn)樗兄跍p少開發(fā)時(shí)間; 你可測試你的新驅(qū)動的連續(xù)的版本, 而不用每次經(jīng)歷漫長的關(guān)機(jī)/重啟周期.

作為一個程序員, 你知道一個應(yīng)用程序可以調(diào)用它沒有定義的函數(shù): 連接階段使用合適的函數(shù)庫解決了外部引用. printf 是一個這種可調(diào)用的函數(shù)并且在 libc 里面定義. 一個模塊, 在另一方面, 只連接到內(nèi)核, 它能夠調(diào)用的唯一的函數(shù)是內(nèi)核輸出的那些; 沒有庫來連接.在 hello.c 中使用的 printk 函數(shù), 例如, 是在內(nèi)核中定義的 printf 版本并且輸出給模塊. 它表現(xiàn)類似于原始的函數(shù), 只有幾個小的不同, 首要的一個是缺乏浮點(diǎn)的支持.

連接一個模塊到內(nèi)核 展示了函數(shù)調(diào)用和函數(shù)指針在模塊中如何使用來增加新功能到一個運(yùn)行中的內(nèi)核.

圖?2.1.?連接一個模塊到內(nèi)核

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號