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...