2012/4/26
每乙個裝置檔案都代表著核心中的乙個file結構體。該結構體在標頭檔案linux/fs.h定義。注意,file結構體是核心空間的結構體, 這意味著它不會在使用者程式的**中出現。它絕對不是在glibc中定義的file。 file自己也從不在核心空間的函式中出現。它的名字確實挺讓人迷惑的。它代表著乙個抽象的開啟的檔案,但不是那種在磁碟上用結構體 inode表示的檔案。
指向結構體struct file的指標通常命名為filp。你同樣可以看到struct file file的表達方式,但不要被它**。
去看看結構體file的定義。大部分的函式入口,像結構體 struct dentry沒有被裝置驅動模組使用,你大可忽略它們。這是因為裝置驅動模組並不自己直接填充結構體 file:它們只是使用在別處建立的結構體file中的資料。
註冊乙個裝置
如同先前討論的,字元裝置通常通過在路徑/dev[1]裝置文 件訪問。主裝置號告訴你哪些驅動模組是用來操縱哪些硬體裝置的。從裝置號是驅動模組自己使用來區別它操縱的不同裝置,當此驅動模組操縱不只乙個裝置時。
將核心驅動模組加載入核心意味著要向核心註冊自己。這個工作是和驅動模組獲得主裝置號時初始化一同進行的。你可以使用標頭檔案 linux/fs.h中的函式register_chrdev來實現。
int register_chrdev(unsigned int major, const char *name, struct file_operations *fops);
其中unsigned int major是你申請的主裝置號, const char *name是將要在檔案/proc/devices struct file_operations *fops是指向你的驅動模組的 file_operations表的指標。負的返回值意味著註冊失敗。注意註冊並不需要提供從裝置號。核心本身並不在意從裝置號。
現在的問題是你如何申請到乙個沒有被使用的主裝置號?最簡單的方法是檢視檔案 documentation/devices.txt從中挑選乙個沒有被使用的。這不是 一勞永逸的方法因為你無法得知該主裝置號在將來會被占用。最終的方法是讓核心為你動態分配乙個。
如果你向函式register_chrdev傳遞為0的主裝置號,那麼返回的就是動態分配的主裝置號。***就是既然你無法得知主裝置號,你就無法預先建 立乙個裝置檔案。 有多種解決方法。第一種方法是新註冊的驅動模組會輸出自己新分配到的主裝置號,所以我們可以手工建立需要的裝置檔案。第二種是利用檔案 /proc/devices新註冊的驅動模組的入口,要麼手工建立裝置檔案,要麼編乙個指令碼去自動讀取該檔案並且生成裝置檔案。第三種是在我們的模組中,當註冊 成功時,使用mknod統呼叫,建立裝置檔案並且呼叫 rm 刪除該裝置 檔案在驅動模組呼叫函式cleanup_module前。
登出乙個裝置
即使時root也不能允許隨意解除安裝核心模組。當乙個程序已經開啟乙個裝置檔案時我 們解除安裝了該裝置檔案使用的核心模組,我們此時再對該檔案的訪問將會導致對已解除安裝的核心模組**記憶體區的訪問。幸運的話我們最多獲得乙個討厭的錯誤警告。如果此時已經在 該記憶體區載入了另乙個模組,倒霉的你將會在核心中跳轉執行意料外的**。結果是無法預料的,而且多半是不那麼令人愉快的。
平常,當你不允許某項操作時,你會得到該操作返回的錯誤值(一般為一負的值)。 但對於無返回值的函式cleanup_module這是不可能的。然而,卻有乙個計數器跟蹤著有多少程序正在使用該模組。你可以通過檢視檔案 /proc/modules的第三列來獲取這些資訊。如果該值非零,則解除安裝就會失敗。你不需要在你模組中的函式cleanup_module中檢查該 計數器,因為該項檢查由標頭檔案linux/module.c中定義的系統呼叫 sys_delete_module完成。你也不應該直接對該計數器進行操作。你應該使用在檔案linux/modules.h定義的巨集 來增加,減小和讀取該計數器:
try_module_get(this_module): increment the use count.
try_module_put(this_module): decrement the use count.
保持該計數器時刻精確是非常重要的;如果你丟失了正確的計數,你將無法解除安裝模組, 那就只有重啟了。不過這種情況在今後編寫核心模組時也是無法避免的。
chardev.c
結構(定義結構 訪問結構 結構引數 結構陣列)
結構由固定的成員構成,每乙個結構變數在記憶體中占有一片連續的記憶體空間。struct是關鍵字,緊接著的型別識別符號是自定義,花括號外面是分號,裡面是不同型別的成員定義,指標,整型,字元型等等都可以。說明變數有三種方式 在第二個花括號之後在分號之前,不用再帶型別識別符號定義,直接寫變數名即可 在分號之...
順序結構 選擇結構 迴圈結構
三種基本結構 順序結構 選擇結構和迴圈結構 1 順序結構 計算機執行程式的步驟是從上到下依次執行 2 選擇結構 條件控制語句 1 if語句 2 if else語句 3 條件表示式 a b a b c語言中唯一的三目運算子 判斷a是否大於b 如果成立,則返回a,否則返回b 4 switch語句 例 s...
流程結構(選擇結構,迴圈結構)
if單選擇結構if 判斷條件 if雙選擇結構if 判斷條件 elseif多選擇結構if 判斷條件1 else if 判斷條件2 else if 判斷條件3 else巢狀的if結構 while 布林表示式 列印1 100的和 public class whiledemo03 system.out.pr...