一、編寫驅動程序
將需要編譯進內核的源代碼編寫好,我舉個最簡單的Hello World的例子:
hello.c
#include <linux/init.h>
#include <linux/module.h>
static int __init hello_init (void)
{
printk("*****hello init test*****\n");
return 0;
}
static void __exit hello_exit (void)
{
printk("*****hello exit*****\n");
}
module_init (hello_init);
module_exit (hello_exit);
MODULE_LICENSE("GPL");
該文件編譯後生成hello.ko文件,在insmod hello.ko的時候會打印 *****hello init test***** ,在rmmod hello的時候打印 *****hello exit*****
我們編寫的驅動程序爲字符設備驅動,因此我們要將hello.c拷貝至drivers/char目錄下。
二、修改Kconfig
Kconfig用來產生make menuconfig的菜單。打開drivers/char目錄下的Kconifg,加入如下代碼:
config HELLO_WORLD
tristate "my hello world test"
具體Kconfig的編寫網上可以找到很多資料。
在Kconfig中加入這項之後,執行make menuconfig ,在Device Drivers -> Character devices 中可以看到多了一項my hello world test:
如果選擇將HELLO WORLD編譯進內核,即將my hello world test前尖括號中配置爲“*”,保存之後看內核代碼的根目錄下的.config,在字符設備中多了一行CONFIG_HELLO_WORLD=y:
三、修改Makefile
注意修改的是drivers/char下的Makefile,加入obj-$(CONFIG_HELLO_WORLD) += hello.o
重新編譯內核,重啓之後可以看到內核打印信息中有“ *****hello init test***** ”,如下圖:
說明hello_init程序在內核啓動的時候就執行了。
而如果將HELLO WORLD配置成模塊編譯,則內核啓動後不會有該條打印信息。
配置成 模塊編譯 的文件可以使用make modules命令,編譯後會生成對應的.ko文件,將.ko文件拷貝至開發板文件系統中用insmod加載纔會打印出“ *****hello init test***** ”,並且此時用 lsmod 能看到 一個名爲“hello”的模塊,
而如果在make menudonfig的時候將模塊 編譯進內核 則用 lsmod 看不到 hello模塊。