20135307 張嘉琪函數
Linux模塊是一些能夠做爲獨立程序來編譯的函數和數據類型的集合。之因此提供模塊機制,是由於Linux自己是一個單內核。單內核因爲全部內容都集成在一塊兒,效率很高,但可擴展性和可維護性相對較差,模塊機制可彌補這一缺陷。測試
Linux模塊能夠經過靜態或動態的方法加載到內核空間,靜態加載是指在內核啓動過程當中加載;動態加載是指在內核運行的過程當中隨時加載。 一個模塊被加載到內核中時,就成爲內核代碼的一部分。模塊加載入系統時,系統修改內核中的符號表,將新加載的模塊提供的資源和符號添加到內核符號表中,以便模塊間的通訊。spa
模塊構造函數:指針
執行insmod或modprobe指令加載內核模塊時會調用的初始化函數。函數原型必須是module_init(),括號內是函數指針進程
模塊析構函數:內存
執行rmmod指令卸載模塊時調用的函數。函數原型是module_exit()資源
模塊許可聲明:原型
函數原型是MODULE_LICENSE(),告訴內核該程序使用的許可證,否則在加載時它會提示該模塊污染內核。通常會寫GPL。 模塊參數(可選) 模塊導出符號(可選) 模塊做者信息聲明(可選)源碼
注意:it
頭文件module.h,必須包含此文件;
頭文件kernel.h,包含經常使用的內核函數;
頭文件init.h包含宏init和exit,容許釋放內核佔用的內存。
寫一個簡單的代碼,用來向內核輸出一段文字。 代碼很簡單,裏面包括了上文提到的構造、析構和許可證。
編譯模塊 接下來寫Makefile。
3. 加載模塊 sudo insmod printname.ko
4.測試模塊 dmesg看內核信息
5.卸載模塊 sudo rmmod printname
這時用dmesg看內核信息,就會看到寫在module_exit()中的輸出。
6.實現輸出當前進程信息的功能
實現了代碼的功能,驗證成功。 7. 實現讀取進程鏈表的功能 在上一個代碼的基礎上,修改代碼。
其實就是個for循環,從第一個PCB(叫作init_task)開始,順着next指針讀了一圈。 修改Makefile,make,insmod,輸出以下圖:
編譯模塊與正常的C語言有一些區別,C語言的innclude文件存放在/usr/include中,而模塊用到的include文件都在/usr/src/內核代碼/include中。因爲頭文件的差別,會產生一些沒法預料的錯誤。在第一次編譯時就出現了make不成功的狀況,修改PATH以後make成功,過程當中也沒有出現其餘問題,完成的比較順利。