在命令行中運(yùn)行隆敢,創(chuàng)建驅(qū)動(dòng)源碼
echo '' > HelloWorld.c
創(chuàng)建編譯規(guī)則文件
echo 'obj-m := HelloWorld.o' > Makefile
上面的 obj-m 意思是將驅(qū)動(dòng)作為模塊(.ko 文件)編譯振惰,還有一種選項(xiàng)是obj-y這個(gè)的作用是將驅(qū)動(dòng)編譯進(jìn)內(nèi)核。
.ko文件可以被動(dòng)態(tài)的加載進(jìn)內(nèi)核,也可以從內(nèi)核中移除束析。
驅(qū)動(dòng)中如果有依賴其他程序申尤,在Makefile文件中添加 模塊名稱-y := 庫名.o 庫名1.o
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>
static int hello_world_init(void){
printk("hello world init seccess");
return 0;
}
static void hello_world_exit(void){
printk("hello world init exit success");
}
module_init(hello_world_init);
module_exit(hello_world_exit);
上面的printk跟printf是一樣的,但是兩個(gè)函數(shù)所運(yùn)行的內(nèi)存空間是不一樣的寻仗,也就是內(nèi)核空間用不了printf函數(shù)刃泌。
接著將HelloWorld.c驅(qū)動(dòng)源碼進(jìn)行編譯
make -C /usr/src/linux-headers-版本號(hào)-generic M=HelloWorld.c的路徑
這里需要注意,這里的版本號(hào)必須要跟宿主系統(tǒng)上的使用的內(nèi)核版本一致署尤。否則編譯不能通過耙替。
在完成編譯之后,需要將驅(qū)動(dòng)進(jìn)行安裝
insmod HelloWorld.ko
查看是否安裝成功:
lsmod | grep HelloWorld
卸載驅(qū)動(dòng)
rmmod HelloWorld
查看驅(qū)動(dòng)輸出的日志
dmesg | grep HelloWorld | tail -n 2
在編寫驅(qū)動(dòng)程序的時(shí)候曹体,需要注意的一點(diǎn)是俗扇,老版本的內(nèi)核驅(qū)動(dòng)編譯可以允許不寫入modinfo數(shù)據(jù)。高版本內(nèi)核是需要進(jìn)行填寫的箕别,如果不寫铜幽,那么將會(huì)編譯不能通過滞谢。
MODULE_AUTHOR(""); 模塊作者
MODULE_DESCRIPTION(""); 模塊描述
MODULE_ALIAS(""); 模塊別名
MODULE_LICENSE(""); 開源協(xié)議
后面再詳細(xì)的理解一下開源協(xié)議。