溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Ubuntu編譯內(nèi)核模塊和內(nèi)容體現(xiàn)系統(tǒng)日志中的示例分析

發(fā)布時(shí)間:2021-12-13 11:08:27 來源:億速云 閱讀:143 作者:小新 欄目:開發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)Ubuntu編譯內(nèi)核模塊和內(nèi)容體現(xiàn)系統(tǒng)日志中的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

1.Linux登陸界面

1.檢查當(dāng)前文件目錄:

通過Xshell連接Linux系統(tǒng)后

輸入命令:ls

Ubuntu編譯內(nèi)核模塊和內(nèi)容體現(xiàn)系統(tǒng)日志中的示例分析

2. 新建code/kernel文件夾

Ubuntu編譯內(nèi)核模塊和內(nèi)容體現(xiàn)系統(tǒng)日志中的示例分析

2.編寫代碼

1.創(chuàng)建hello_module.c

指令:vim hello_module.c

2.按i進(jìn)入編輯模式,并輸入以下代碼

 //hello_module.c #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h>  static int __init hello_init(void){    printk("This is hello_module, welcome to Linux kernel \n");    return 0; }  static void __exit hello_exit(void){    printk("see you next time!\n"); }  module_init(hello_init); module_exit(hello_exit);  MODULE_LICENSE("GPL"); MODULE_AUTHOR("Mr Q"); MODULE_DESCRIPTION("hello kernel module"); MODULE_ALIAS("hello");

Ubuntu編譯內(nèi)核模塊和內(nèi)容體現(xiàn)系統(tǒng)日志中的示例分析Ubuntu編譯內(nèi)核模塊和內(nèi)容體現(xiàn)系統(tǒng)日志中的示例分析

以上代碼解釋如下:
(1) #include <linux/module.h>:必須。module.h 頭文件包含了對(duì)模塊的結(jié)構(gòu)定義以及模塊的版本控制,任何模塊程序的編寫都要包含這個(gè)頭文件;
(2) #include <linux/kernel.h>:kernel.h 包含了常用的內(nèi)核函數(shù),如以上程序中的 printk()函數(shù);
(3) #include <linux/init.h>:必須。init.h 包含了 module_init()和 module_exit()函數(shù)的聲明;
(4) module_init():必須。模塊加載函數(shù),加載模塊式該函數(shù)自動(dòng)執(zhí)行,進(jìn)行初始化操作;
(5) module_exit():必須。模塊卸載函數(shù),卸載模塊時(shí)函數(shù)自動(dòng)執(zhí)行,進(jìn)行清理操作; (6) MODULE_LICENSE():表示模塊代碼接受的軟件許可協(xié)議。Linux 內(nèi)核是使用 GPL V2 的開源項(xiàng)目,其要求所有使用和修改了 Linux 內(nèi)核代碼的個(gè)人或組織都有義務(wù)把修改后的源代碼公開,這是一個(gè)強(qiáng)制的開源協(xié)議,所以一般編寫驅(qū)動(dòng)代碼都需要顯示的聲明和遵循本協(xié)議,否則內(nèi)核 UI 發(fā)出被污染的警告;
(7) MODULE_AUTHOR():描述模塊的作者信息;
(8) MODULE_DESCRIPTION():簡(jiǎn)單描述模塊的用途、功能介紹等;
(9) MODULE_ALIAS():為用戶控件提供的別名;
(10) printk():內(nèi)核輸出函數(shù),默認(rèn)打印系統(tǒng)文件 " /var/log/kern.log"的內(nèi)容。

3. 保存退出,并觀察文件目錄
按鍵ESC;
:wq

Ubuntu編譯內(nèi)核模塊和內(nèi)容體現(xiàn)系統(tǒng)日志中的示例分析

3.編寫Makefile文件

vim Makefile

 obj-m := hello_module.o
 
 KERNELBUILD := /lib/modules/$(shell uname -r)/build
 CURRENT_PATH := $(shell pwd)
 
 all:
     make -C $(KERNELBUILD) M=$(CURRENT_PATH) modules
 
 clean:
         make -C $(KERNELBUILD) M=$(CURRENT_PATH) clean

以上代碼解釋如下:
(1) obj-m := <模塊名>.o:定義要生成的模塊名稱
(2) KERNELBUILD := /lib/modules/$(shell uname -r)/build : KERNELBUILD 為自定義名稱,用于指向正在運(yùn)行 Linux 的內(nèi)核編譯目錄,其中“uname -r”標(biāo)識(shí)顯示對(duì)應(yīng)的內(nèi)核版本;
(3) CURRENT_PATH := $(shell pwd):CURRENT_PATH 為自定義名稱,用于指向當(dāng)前當(dāng)前目錄;
(4) all:編譯執(zhí)行的動(dòng)作
(5) clean:zhixing make clean 需要的動(dòng)作?!癿ake clean”用于清除上次的 make 命令所產(chǎn)生的 object 文件(后綴為“.o”的文件)及可執(zhí)行文件。

:wq保存退出

4.編譯:

輸入指令:make

Ubuntu編譯內(nèi)核模塊和內(nèi)容體現(xiàn)系統(tǒng)日志中的示例分析

可以看到編譯后的文件

Ubuntu編譯內(nèi)核模塊和內(nèi)容體現(xiàn)系統(tǒng)日志中的示例分析

檢查編譯模塊

Ubuntu編譯內(nèi)核模塊和內(nèi)容體現(xiàn)系統(tǒng)日志中的示例分析

也可通過 modinfo 命令進(jìn)一步檢查 :

Ubuntu編譯內(nèi)核模塊和內(nèi)容體現(xiàn)系統(tǒng)日志中的示例分析

5.插入模塊

通過 insmod 命令插入模塊,完成插入后可通過 lsmod 命令查看當(dāng)前模塊是否已經(jīng)被加載到系統(tǒng)中:

Ubuntu編譯內(nèi)核模塊和內(nèi)容體現(xiàn)系統(tǒng)日志中的示例分析

第一個(gè)就是.

系統(tǒng)加載模塊后,也會(huì)在“/sys/module”目錄下新建以模塊名命名的目錄 :

Ubuntu編譯內(nèi)核模塊和內(nèi)容體現(xiàn)系統(tǒng)日志中的示例分析

6.查看日志輸出

因 本 演示 中 prink()采 用 默認(rèn) 輸出 等級(jí) ,可 通 過“ dmesg” 或“ tail /var/log/kern.log”命令查看輸出結(jié)果。

Ubuntu編譯內(nèi)核模塊和內(nèi)容體現(xiàn)系統(tǒng)日志中的示例分析

感謝各位的閱讀!關(guān)于“Ubuntu編譯內(nèi)核模塊和內(nèi)容體現(xiàn)系統(tǒng)日志中的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI