首先需要編譯一份linux內核並使之運行起來,然後開始第一個驅動程序Hello World的實踐。
1、新建一個目錄並新建hello.c文件
參考LLD3上的代碼。
注意代碼中的tab鍵位置不要用空格代替,會出問題,具體原因還不瞭解。
並且tab鍵要調成4個空格大小,ubuntu的gedit編輯器默認是8個。
#include <linux/init.h>
#include <linux/module.h>
static int hello_init(void)
{
printk(KERN_ALERT "Hello, World\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, World\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("Dual BSD/GPL");
2、在同一個目錄下新建Makefile
新建Makefile文件,文件名不要隨意改動,據說會有問題。例如:makefile是不行的。
注意KERNELDIR := 後的路徑要寫自己modules目錄裏的相應位置。
同樣需要注意tab
ifeq ($(KERNELRELEASE),)
KERNELDIR := /lib/modules/4.14.6/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
else
obj-m := hello.o
endif
3、編譯測試
在hello.c這個目錄中打開終端,切換到root模式,依次執行以下三條命令
make
insmod ./hello.ko
rmmod hello
如果在insmod命令後終端打印了“Hello World”,並且rmmod命令後打印了“Goodbye World”,那麼這部分就結束了。如果很不幸的沒有打印出來就到/var/log/kern.org裏看一下。這是由於系統傳遞消息機制的不同,輸出到了系統日誌文件中。據說不同的系統文件名可能略有不同。