Linux實驗二:Linux 核心模組測試

來源:互聯網
上載者:User
一、實驗目的

對Linux核心模組進行瞭解。

二、實驗內容

建立一個核心模組,在載入和卸載模組時在核心中列印相關資訊。

三、背景知識:

一、什麼是核心模組?

       核心模組是Linux核心向外部提供的一個插口,其全稱為動態可載入核心模組(Loadable Kernel Module,LKM),我們簡稱為模組。Linux核心之所以提供模組機制,是因為它本身是一個單核心(monolithickernel)。單核心的最大優點是效率高,因為所有的內容都整合在一起,但其缺點是可擴充性和可維護性相對較差,模組機制就是為了彌補這一缺陷。

模組是具有獨立功能的程式,它可以被單獨編譯,但不能獨立運行。它在運行時被連結到核心作為核心的一部分在核心空間運行,這與運行在使用者空間的進程是不同的。模組通常由一組函數和資料結構組成,用來實現一種檔案系統、一個驅動程式或其他核心上層的功能。

總之,模組是一個為核心(從某種意義上來說,核心也是一個模組)或其他核心模組提供使用功能的代碼塊。

 

二、核心模組編寫

編寫核心模組時必須要有的兩個函數 :
     __init 和 __exit 是 Linux 核心的一個宏定義,使系統在初始化完成後釋放該函數,並釋放其所佔記憶體。因此它的優點是顯而易見的。建議在編寫入口函數和出口函數時採用後面的方法。
   還有,在核心編程時所用的庫函數和在使用者態下的是不一樣的。如模組程式中使用的printk函數,對應於使用者態下的printf函數,printk 是核心態資訊列印函數,功能和printf類似但 printk還有資訊列印層級。

載入模組和卸載模組:
1>module_init(hello_init)
    a. 告訴核心你編寫模組程式從那裡開始執行。
    b.module_init() 函數中的參數就是註冊函數的函數名。
2>module_exit(hello_exit)
    a. 告訴核心你編寫模組程式從那裡離開。

    b.module_exit() 中的參數名就是卸載函數的函數名。

 

三、核心模組編譯:

第一步:模組原始碼,如果使用vi更好,直接wq儲存退出即可!

第二步:寫一個Makefile檔案。

Makefile檔案所做的工作是編譯產生.o,.ko等模組相關檔案!

四、實驗步驟:

一、編寫模組代碼HelloWorld.c

二、編寫Makefile檔案

三、編譯模組

四、載入卸載HelloWorld模組

五、查看模組資訊

六、卸載HelloWorld模組

七、查看模組資訊

 

五、實驗示範:

               

進入Linux終端控制台,建立HelloWorld.c檔案,可用vi HelloWorld.c建立並編寫內容。

// HelloWorld.c:

                                               圖2-1  模組HelloWorld代碼

建立Makefile檔案(注意檔案名稱大小寫區分)

圖2-2 模組HelloWorld的Makefile設定檔

注意:

      “make –C/lib  ......”語句

       make語句前面的空格為定位字元(按tab鍵),-C 中的C為大寫,不能為小寫

儲存好後在終端目前的目錄執行make操作進行編譯,如:

圖2-3 對模組HelloWorld執行make操作

編譯好後會產生許多檔案:

圖2-4 模組HelloWorld編譯後的內容

 

最後對模組進行載入和卸載測試:

終端在目前的目錄下,輸入命令 insmod ./HelloWorld.ko;

輸入命令 lsmod,能找到名為HelloWorld 的模組,說明模組已經載入;

圖2-5 模組HelloWorld已經載入到核心

 

輸入命令 dmesg,查看最後一行,會有模組載入時調用的函數輸出;

輸入命令 rmmod HelloWorld ,卸載模組(注意與載入時不同),然後輸入lsmod,已經找不到HelloWorld模組,說明模組已經卸載;

輸入命令 dmesg,查看模組卸載是調用的函數輸出。

 

圖2-6 模組HelloWorld載入以及卸載時核心模組的記錄

六、實驗小結:

l Makefile 是一種指令碼,這種指令碼主要是用於多檔案的編譯

l make 程式可以維護具有相互依賴性的源檔案,但某些檔案發生改變時,它能自動識別出,並只對相應檔案進行自動編譯。

上述簡單例子中的Makefile檔案的內容為:obj-m:=helloworld.o,在這我要提醒大家,在網上有許多種Makefile檔案的寫法,但都太麻煩了,如果寫的是核心模組,obj-m:=*.o足矣(*是你的模組檔案名稱,比如上面的hellworld.c檔案).之後使用

make -Wall -C /lib/modules/`uname -r`/build M=`pwd`modules

命令產生helloworld.o,helloworld.ko等檔案,有的人直接使用

make -C /lib/modules/`uname -r`/build M=`pwd` modules

中間省略了-Wall,Wall可以看成 W+all,而W代表Warning,所以使用 -Wall 即是顯示所有警告!

 

l 載入模組命令:insmod helloworld.ko

l 卸載模組命令:rmmod helloworld.ko

查看模組資訊:dmesg

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.