網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
Ubuntu編譯內(nèi)核模塊,內(nèi)容體現(xiàn)系統(tǒng)日志中_Linux
作者:giant潘潘潘潘潘潘潘潘潘潘潘潘潘 ? 更新時(shí)間: 2021-12-06 編程語(yǔ)言1.Linux登陸界面
1.檢查當(dāng)前文件目錄:
通過(guò)Xshell連接Linux系統(tǒng)后
輸入命令:ls
2. 新建code/kernel文件夾
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");
以上代碼解釋如下:
(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 的開(kāi)源項(xiàng)目,其要求所有使用和修改了 Linux 內(nèi)核代碼的個(gè)人或組織都有義務(wù)把修改后的源代碼公開(kāi),這是一個(gè)強(qiáng)制的開(kāi)源協(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
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)作。“make clean”用于清除上次的 make 命令所產(chǎn)生的 object 文件(后綴為“.o”的文件)及可執(zhí)行文件。
:wq保存退出
4.編譯:
輸入指令:make
可以看到編譯后的文件
檢查編譯模塊
也可通過(guò) modinfo 命令進(jìn)一步檢查 :
5.插入模塊
通過(guò) insmod 命令插入模塊,完成插入后可通過(guò) lsmod 命令查看當(dāng)前模塊是否已經(jīng)被加載到系統(tǒng)中:
第一個(gè)就是.
系統(tǒng)加載模塊后,也會(huì)在“/sys/module”目錄下新建以模塊名命名的目錄 :
6.查看日志輸出
因 本 演示 中 prink()采 用 默認(rèn) 輸出 等級(jí) ,可 通 過(guò)“ dmesg” 或“ tail /var/log/kern.log”命令查看輸出結(jié)果。
原文鏈接:https://blog.csdn.net/weixin_44899437/article/details/121880616
相關(guān)推薦
- 2022-09-26 數(shù)據(jù)庫(kù)基本增刪改查語(yǔ)法和多表鏈接查詢的方式
- 2022-07-06 C++使用easyx實(shí)現(xiàn)打磚塊游戲_C 語(yǔ)言
- 2022-04-26 SQL將一個(gè)表中的數(shù)據(jù)插入到另一個(gè)表中的方法_MsSql
- 2022-06-02 C++的智能指針你真的了解嗎_C 語(yǔ)言
- 2022-08-24 K8S之StatefulSet有狀態(tài)服務(wù)詳解_云其它
- 2022-12-01 Go語(yǔ)言常用的打log方式詳解_Golang
- 2022-09-14 iOS實(shí)現(xiàn)簡(jiǎn)單長(zhǎng)截圖_IOS
- 2024-04-04 jQuery實(shí)現(xiàn)ajax語(yǔ)法,post請(qǐng)求發(fā)送數(shù)組對(duì)象(jquery)
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支