linux 核心學習10 從第乙個核心模組開始

2021-09-26 16:34:30 字數 4442 閱讀 6928

c檔案

#include

#include

// 該核心模組初始化函式 可以通過insmod命令來載入乙個核心模組

static

int __init my_test_init

(void

)// 該核心模組退出函式 ,可以使用rmmod命令解除安裝乙個核心模組

static

void __exit my_test_exit

(void

)//核心入口 my_test_init()

module_init

(my_test_init)

;//核心出口 這個模組的退出函式時my_test-exit()

module_exit

(my_test_exit)

;// 使用接受的軟體許可協議

module_license

("gpl");

// 描述模組的作者資訊

module_author

("xiao");

// 簡單描述該模組的用途或者功能

module_description

("my test kernel module");

//為使用者控制項提供乙個合適的別名

module_alias

("mytest"

);

makefile檔案

1 baseinclude ?=/lib/modules/`uname -r`/build

2 3 mytest-objs :=my_test.o

4 obj-m :=mytest.o

5 6 all :

7 $(make) -c $(baseinclude) m=$(pwd) modules;

8 clean:

9 $(make) -c $(baseinclude) subdirs=$(pwd) clean;

10 rm -f *.ko;

第三行

《模組名》-objs :=《目標檔案》.o

第四行obj-m :=《模組名》.o

第6-7行表示要編譯執行的動作。

第8-10行表示執行make clean 需要的動作

接著輸入make命令來編譯

$ make
檢視核心資訊

$ uname -r

5.0.0-25-generic

$ cd /lib/modules/4.15.0-58-generic

$ ls -l

total 5300

drwxr-xr-x 2 root root 4096 aug 6 03:45 initrd

drwxr-xr-x 16 root root 4096 aug 21 02:36 kernel

-rw-r--r-- 1 root root 1269888 aug 21 02:36 modules.alias

-rw-r--r-- 1 root root 1250246 aug 21 02:36 modules.alias.bin

-rw-r--r-- 1 root root 7629 aug 6 03:45 modules.builtin

-rw-r--r-- 1 root root 9685 aug 21 02:36 modules.builtin.bin

-rw-r--r-- 1 root root 551723 aug 21 02:36 modules.dep

-rw-r--r-- 1 root root 780064 aug 21 02:36 modules.dep.bin

-rw-r--r-- 1 root root 317 aug 21 02:36 modules.devname

-rw-r--r-- 1 root root 206075 aug 6 03:45 modules.order

-rw-r--r-- 1 root root 540 aug 21 02:36 modules.softdep

-rw-r--r-- 1 root root 590768 aug 21 02:36 modules.symbols

-rw-r--r-- 1 root root 720722 aug 21 02:36 modules.symbols.bin

drwxr-xr-x 3 root root 4096 aug 21 02:36 vdso

編譯之後的結果

$ ls 

makefile module.symvers mytest.ko mytest.mod.o mytest.o

modules.order my_test.c mytest.mod.c my_test.o

可以通過file命令來檢查編譯的模組是否正確。可以看到程式設計x86-64架構的elf檔案,已經成功了

$ file mytest.ko

mytest.ko: elf 64-bit lsb relocatable, x86-64, version 1 (sysv), buildid[sha1]=eb0017daac8924d6450529c21430501d0cbefa7e, not stripped

也可以通過modinfo進一步檢查

$ modinfo mytest.ko

filename: /home/groot/test/mytest.ko

alias: mytest

description: my test kernel module

author: xiao

license: gpl

srcversion: c4abc60e9eb1421d8527091

depends:

retpoline: y

name: mytest

vermagic: 5.0.0-25-generic smp mod_unload

驗證模組

$ sudo insmod mytest.ko
$dmesg |grep first
檢視核心列印日誌

[39568.716952] my first kernel module init
也可以使用lsmod命令檢視當前的mytest模組是否已經被載入到系統中

lsmod

module size used by

mytest 16384 0 //這個就是自定義摸模組

載入模組之後,系統會在sys/modules目錄下新建乙個目錄,比如對於mytest模組會建乙個名為mytest的目錄

$ sudo tree -a             

.├── coresize

├── holders

├── initsize

├── initstate

├── notes

│ └── .note.gnu.build-id

├── refcnt

├── sections

│ ├── .exit.text

│ ├── .gnu.linkonce.this_module

│ ├── .init.text

│ ├── __mcount_loc

│ ├── .note.gnu.build-id

│ ├── .note.linux

│ ├── .rodata.str1.1

│ ├── .strtab

│ └── .symtab

├── srcversion

├── taint

└── uevent

3 directories, 17 files

解除安裝模組

$ sudo  rmmod mytest.ko
模組載入函式:載入模組時,該函式會先自動執行,通常做一些初始化工作。

模組解除安裝函式:解除安裝模組時,該函式也會被自動執行,執行一些清理工作。

木塊許可宣告:核心模組必須宣告許可證,否則核心會發出被汙染警告。

模組引數:根據需求來新增,為可選項

模組作者和描述宣告:一般都需要完善這些資訊

模組匯出符號:根據需求來新增,為可選項

核心位址

第乙個核心驅動

測試驅動開發平台 為了後續學習的順利進行,我們利用最簡單的hello,world程式,在核心上掛載和解除安裝我們自己編寫的hello模組。說明 本文除錯環境vmware workstation 5.0 turbolinux 10,教材是 linux device drivers 第3版英文電子圖書。...

第乙個核心測試程式

1.在vmware安裝上centos 網路設定,參考注意在centos 右上角的網路圖示選擇對應的網路裝置。2.安裝gcc環境 yum install gcc c 3.安裝核心檔案 yum install kernel devel 4.編寫hello.c檔案 例子參考 include include...

學習linux的第乙個程式

今天開始做了小馬哥布置的第乙個程式 說到底 本來之前c語言就沒好好學 這下可折騰死我了 翻書 看資料 還是完成了 來看看吧 include 包含標頭檔案 int main 主函式 int n,m,z n為輸入的數 m z為變數 int i,j 0 printf 輸入 n的值 scanf d n fo...