將自己的模塊編譯進內核

一、編寫驅動程序

  將需要編譯進內核的源代碼編寫好,我舉個最簡單的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模塊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章