在/proc文件系統中增加一個目錄hello,並在這個目錄中增加一個文件world,文件的內容為hello world


一、題目

編寫一個內核模塊,在/proc文件系統中增加一個目錄hello,並在這個目錄中增加一個文件world,文件的內容為hello world。內核版本要求2.6.18

 

二、實驗環境

物理主機:win7 64bit, i5雙核,8G內存

虛擬機:Vmware Workstation 10.0.2

虛擬主機: CentOs-5.11,內核2.6.18

 

三、實驗思路

在着手解決問題之前,我在網上查閱了一些資料,大多是關於模塊的介紹。linux內核采用的是模塊化編程,這樣可以很容易的添加或刪除一個功能,同時可以在內核運行的過程中可以動態的添加功能,這部分功能的代碼被稱為"模塊",我們寫的驅動程序就是一個模塊。模塊在需要使用的時候被加載,不需要的時候可以卸載,這樣可以有效的精簡系統。對於plinux中的/proc文件系統,它是一個虛擬的文件系統,由內核在運行時動態生成。它提供了內核運行時的配置和狀態信息。用戶可以通過這些文件來獲取、或修改內核的信息。根據題目要求,我們首先要在/proc目錄下創建一個hello目錄,再在hello目錄下創建world文件,文件中的內容為hello world,因此,首先要了解在/proc下創建目錄和文件的函數。

struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode, struct proc_dir_entry *parent);

name:文件名

mode:文件權限

parent:文件在 /proc 文件系統中父目錄指針。

返回值是創建完成的 proc_dir_entry 指針(或者為 NULL,說明在 create 時發生了錯誤)。然后通過這個返回的指針來初始化這個文件入口的其他參數,如在對該文件執行讀寫操作時應該調用的函數。

 

四、具體實現步驟

1.准備工作

  • 查看內核版本

使用 uname -a 命令查看當前內核版本:

 

  • 寫內核模塊需要root權限,升級至root用戶

 

2. 編寫helloworld.c文件

創建一個文件夾然后創建一個文件helloworld.c

 

3.編寫Makefile

接下來編寫Makefile文件,該文件與helloworld.c位於同一文件夾下

 

4. 運行make

編寫完makefile文件后,保存退出,在makefile文件所在的目錄下運make命令

  • 此時出現錯誤,提示如截圖所示
  • 進入錯誤提示的文件夾下,可以看到紅色的build文件,紅色表build是一個鏈接

  • 進一步用ls –l查看其文件屬性,build實際指向的是/usr/src/kernels/2.6.18-398.e15-i686

 

  • 安裝之后,仍然報錯,於是查看build指向的文件夾

  • 發現我自己的電腦上,對應的文件夾名字如下(這里讓我感覺很奇怪,因為實驗一開始的時候,用uname -a命令查看內核版本的時候,子版本號是398,但是在系統中,內核對應文件夾名卻是402)於是把402改為398

 

  • 然后就可以進行編譯了

 

  • make之后會生成一些跟模塊相關的文件,如下圖

 

5. 查看.ko文件屬性

用modinfo命令查看make生成的.ko文件的屬性

  • 出現錯誤,提示為找不到命令
  • 解決方案:可以在home目錄下查看.bash_profile里的PATH。如果是:PATH=$PATH:$HOME/bin則需要添加成如下:

PATH=$PATH:$HOME/bin:/sbin:/usr/bin:/usr/sbin

(參考:http://www.jb51.net/LINUXjishu/32192.html)這個問題也是裝系統時只裝了精簡模式導致的,這導致有些命令不能使用

  • 然后重新啟動虛擬機,再次運行modinfo命令就可以查看模塊信息了

 

6. 加載模塊

接下來用insmod加載模塊

 

7. 查看所有模塊

模塊加載成功后,就可以使用lsmod列出所有的模塊,如下圖,可以看到helloworld模塊

 

8. 查看內核日志信息

用dmesg | tail 輸出內核中的日志信息

可以看到最后一行已經打印出了代碼中設定的文本

 

 

9. 打開打開/proc/hello/world

最后打開/proc/hello/world ,則會輸出/proc/hello/world 內容

至此,模塊加載的工作已經完成,下面開始卸載模塊

 

10. 卸載模塊

用rmmod來卸載模塊

 

11. 查看當前模塊

再次查看當前的模塊,可以看到已經沒有helloworld了

 

12. 查看打印信息

查看卸載時的打印信息

卸載成功,實驗結束

 

五、總結

    通過這次實驗,對Linux系統的模塊編程有了一定的了解。一個Linux內核模塊主要由如下幾個部分組成。

(1)模塊加載函數

當通過insmod或modprobe命令加載內核模塊時,模塊的加載函數會自動被內核執行,完成本模塊的相關初始化工作。

(2)模塊卸載函數

當通過rmmod命令卸載某模塊時,模塊的卸載函數會自動被內核執行,完成與模塊卸載函數相反的功能。

(3)模塊許可證聲明

許可證(LICENSE)聲明描述內核模塊的許可權限,如果不聲明LICENSE,模塊被加載時,將收到內核被污染 (kernel tainted)的警告。

在Linux內核模塊領域,可接受的LICENSE包括"GPL"、"GPL v2"、"GPL and additional rights"、"Dual BSD/GPL"、"Dual MPL/GPL"和"Proprietary"(關於模塊是否可以采用非GPL許可權如"Proprietary",這個在學術界和法律界都有爭議)。

大多數情況下,內核模塊應遵循GPL兼容許可權。Linux內核模塊最常見的是以MODULE_LICENSE( "GPL v2" )語句聲明模塊采用GPL v2。

    在編譯內的時候,如果用Makefile方式的話,要特別注意在Makefile文件中,需要空格的地方都用tab鍵代替,否則會出現錯誤。同時,需要將內核源代碼所在的目錄作為一個參數傳遞給make命令。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM