萬盛學電腦網

 萬盛學電腦網 >> Linux教程 >> Linux--Linux內核模塊編程-將/proc作為輸入在線閱讀

Linux--Linux內核模塊編程-將/proc作為輸入在線閱讀

 將 /proc 作為輸入
  迄今為止,我們有兩中辦法從內核模塊中產生輸出:我們可以登記一個設備驅動程序並 mknod 一個設備文件,或者我們可以創建一個/proc文件。這可以讓內核模塊告訴我們任何它可能告訴我們的事情。唯一的問題是這沒有辦法讓我們告訴它。我們將輸入發送給內核模塊的第一個辦法將是通過寫回 /proc 文件。
  因為 proc 文件系統主要是為了讓內核報告它對進程的狀態,所以對輸入沒有專門的預備。 proc_dir_entry結構沒有包含一個指向輸入函數的指針而包含輸出函數的指針。為了向/proc 文件中寫,我們需要使用標准的文件系統機制。
  在 Linux 中對文件系統登記有標准的機制。既然每個文件系統必須有它自己的處理節點和文件操作(兩者的不同在於文件操作處理文件自己,而節點操作處理對文件的引用,例如創建對它的連接)的函數, 所以有一個特殊的結構保存所有這些函數的指針, inode_operations 結構, 包含一個指向 file_operations結構的指針。在 /proc 中,任何時候登記一個新文件我們都允許特別指定哪個 inode_operations 結構將用於訪問它。這就是我們使用的機制, inode_operations 結構包含指向 file_operations 結構的指針,而它又包含指向我們的module_input 和 module_output 函數的指針。
  注意在內核中標准的讀寫的任務是顛倒的。讀函數用作輸出而寫函數用於輸入。造成這個局面的原因是讀寫是依據用戶的觀點--如果一個進程從內核中讀什麼,那麼內核就需要輸出它,而如果進程向內核中寫什麼,那麼內核就需要將它作為輸入接收。
  這兒另一個引起注意的地方是 module_permission 函數。這個函數在進程試圖用 /proc文件做什麼的時候被調用,並且它決定是否允許訪問。現在它僅僅基於操作和當前用戶的UID(就像 current 中的那樣,一個指向包含當前運行進程的信息的結構的指針),但它也可以基於任何我們喜歡的東西,例如其他進程在用該文件做什麼,時間,或者我們上次的接收的輸入。
  使用 put_user 和 get_user 的原因是在 Linux 中內存 (在Intel 架構下,在其他處理器下可能不同)是分段的。這意味著指針不能單獨由它自己指向一個唯一的內存位置,只是在內存的段中的位置,你需要知道它可以使用哪個內存段。對內核只有一個內存段,其他進程也各有一個。
  進程只能訪問自己的內存段,因此當寫普通的作為進程運行的程序時我們不必為段操心。當你寫內核模塊時,通常你想訪問內核的內存段,它由系統自動的處理。然而,當內存緩沖區中的內容需要在當前進程和內核中傳遞時,內核的函數收到的是指向位於進程的內存段中的內存緩沖區的指針。 put_user 和 get_user 宏可以讓你訪問那些內存。


copyright © 萬盛學電腦網 all rights reserved