Linux內核 實踐二

實踐二 內核模塊編譯


20135307 張嘉琪函數

1、實驗原理

  • Linux模塊是一些能夠做爲獨立程序來編譯的函數和數據類型的集合。之因此提供模塊機制,是由於Linux自己是一個單內核。單內核因爲全部內容都集成在一塊兒,效率很高,但可擴展性和可維護性相對較差,模塊機制可彌補這一缺陷。測試

  • Linux模塊能夠經過靜態或動態的方法加載到內核空間,靜態加載是指在內核啓動過程當中加載;動態加載是指在內核運行的過程當中隨時加載。 一個模塊被加載到內核中時,就成爲內核代碼的一部分。模塊加載入系統時,系統修改內核中的符號表,將新加載的模塊提供的資源和符號添加到內核符號表中,以便模塊間的通訊。spa

2、編寫模塊代碼

  • 模塊構造函數:指針

    執行insmod或modprobe指令加載內核模塊時會調用的初始化函數。函數原型必須是module_init(),括號內是函數指針進程

  • 模塊析構函數:內存

    執行rmmod指令卸載模塊時調用的函數。函數原型是module_exit()資源

  • 模塊許可聲明:原型

    函數原型是MODULE_LICENSE(),告訴內核該程序使用的許可證,否則在加載時它會提示該模塊污染內核。通常會寫GPL。  模塊參數(可選)  模塊導出符號(可選)  模塊做者信息聲明(可選)源碼

  • 注意:it

    • 頭文件module.h,必須包含此文件;

    • 頭文件kernel.h,包含經常使用的內核函數;

    • 頭文件init.h包含宏init和exit,容許釋放內核佔用的內存。

  1. 寫一個簡單的代碼,用來向內核輸出一段文字。 代碼很簡單,裏面包括了上文提到的構造、析構和許可證。

  2. 編譯模塊 接下來寫Makefile。

  • 第一行的printname換成你本身寫的.c文件名。
  • 第三行的LINUXKERNELPATH後面要寫你本身的內核版本對應的內核源碼包地址
  • 解釋一下make命令: make -C $(LINUX_KERNELPATH) 指明跳轉到內核源碼目錄下讀取那裏的Makefile M=$(CURRENTPATH) 代表返回到當前目錄繼續執行當前的Makefile。
  • make以後的執行時這樣的:

      3. 加載模塊 sudo insmod printname.ko

      4.測試模塊 dmesg看內核信息

      5.卸載模塊 sudo rmmod printname

這時用dmesg看內核信息,就會看到寫在module_exit()中的輸出。

      6.實現輸出當前進程信息的功能

實現了代碼的功能,驗證成功。 7. 實現讀取進程鏈表的功能 在上一個代碼的基礎上,修改代碼。

其實就是個for循環,從第一個PCB(叫作init_task)開始,順着next指針讀了一圈。 修改Makefile,make,insmod,輸出以下圖:

3、總結

    編譯模塊與正常的C語言有一些區別,C語言的innclude文件存放在/usr/include中,而模塊用到的include文件都在/usr/src/內核代碼/include中。因爲頭文件的差別,會產生一些沒法預料的錯誤。在第一次編譯時就出現了make不成功的狀況,修改PATH以後make成功,過程當中也沒有出現其餘問題,完成的比較順利。

相關文章
相關標籤/搜索