1、什麼是核心模組。
核心模組是Linux核心向外部提供的一個插口,其全稱為動態可載入核心模組(Loadable Kernel Module,LKM),簡稱為模組。Linux核心之所以提供模組機制,是因為它本身是一個單核心(monolithic kernel)。單核心的最大優點是效率高,因為所有的內容都整合在一起,但其缺點是可擴充性和可維護性相對來說比較差,引入模組機制就是為了彌補這一缺陷。
模組是具有獨立功能的程式,它可以被單獨編譯,但不能獨立運行。它在運行時被連結到核心作為核心的一部分在核心空間運行,這與運行在使用者空間的進程是不同的。模組通常由一組函數和資料結構組成,用來實現一種檔案系統、一個驅動或其他核心上層的功能。
總之模組是一個為核心或者其他核心模組提供使用功能的代碼塊。
2、編寫第一個小模組執行個體
環境:VMware 版本:12.0.0
CentOS 7
1)進入虛擬機器,開啟Linux終端,擷取root許可權。
2)建立一個檔案夾(mkdir命令建立一個名為hello的檔案)
3)進入hello檔案夾,並建立一個名為hello.c的檔案,再編輯hello.c檔案。(若沒有這個檔案時,vim命令會同時建立這個檔案,並且進入vi編輯器對檔案進行編輯)
(cd hello為進入hello檔案夾)
輸入如下內容:
編輯完成後,先按左上方Esc鍵,再同時按Shift+:兩個鍵,最後輸入小寫wq(功能是儲存編輯並退出編輯)。
註:hello_init和hello_exit這兩個我們定義的函數稱為模組的插入與刪除(目的是列印訊息到核心緩衝區);__init與__exit是屬性---連接到函數的資料元片(注意這兩個屬性錢的底線是雙底線);GPL是一份GNU通用公用授權許可證;module_init()和 module_exit()是兩個宏,將上面的兩個函數設定為我們模組的生命週期回呼函數;還有就是要注意書寫格式,該大寫的地方要大寫,該tab的地方要tab,不然很容易在編譯的時候報錯。
4)編寫Makefile檔案(注意Makefile檔案沒有尾碼,並且M要大寫同樣使用vim命令)。
編寫Makefile檔案:
結束編輯並儲存(先Esc再Shift+:最後wq)。
註:在ifneq後面要有一個空格,寫all和clean的內容時要有一個tab的空間。(在這裡會有顏色的提示)
5)執行make指令(直接make,後面不用加東西)
6)查看檔案夾下的檔案(使用ls命令)
除了hello.c檔案和Makefile檔案之外,其它全部為make後自動產生的檔案(ls命令為查看當前檔案夾下的內容目錄)
7)載入模組進核心(使用insmod命令)
載入make產生的hello.ko檔案進核心。(輸入insmod hello.ko檔案後直接斷行符號)
8)查看載入進去的模組(使用lsmod命令)
(lsmod命令即為查看核心模組的命令)
執行命令後的結果:(可以看到第三行的hello模組,說明模組載入成功)
使用dmesg命令查看記錄檔:(使用dmesg命令)
查看記錄檔:(列印出Hello Linux。註:第一個Hello。 Linux。和Byebye。 Linux是我上次啟動並執行結果)
9)卸載模組(使用rmmod命令)
查看記錄檔:(列印出Byebye。 Linux。)
(也可用lsmod查看是否卸載成功,看hello模組是否還在核心目錄中)
好了,到這裡,恭喜你已經實現了你的第一個核心模組的編寫、載入以及卸載了。。