2017年6月28日 星期三

Chapter 1: Hello world kernel module

簡單記錄一下第一支kernel module


#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
#include <linux/init.h>   /* Needed for the marcos */

MODULE_LICENSE("GPL");

static int __init hello_init(void)
{
    printk(KERN_INFO "Hello world\n");
    return 0;
}

static void __exit hello_exit(void)
{
    printk(KERN_INFO "Goodbye~~~\n");
}

module_init(hello_init);
module_exit(hello_exit);



 Makefile

obj-m += hello.o

KERNEL=/lib/modules/`uname -r`/build

all:
    make -C $(KERNEL) M=$(shell pwd) modules

clean:
    make -C $(KERNEL) M=$(shell pwd) clean

module_init()以及module_exit()是kernel module初始化的起點,所以是kernel module不可或缺的要素。module_init()以及module_exit()裡面代的參數分別是起始與結束的函數。從例子可以看到起始函數是hello_init()而結束函數是hello_exit()。
因此當用insmod去載入編譯好的ko檔時,透過dmesg可以看到字串"Hello world",而用rmmod時可以看到字串"Goodbye~~~"。

當要在kernel裡面秀出message時要透過printk()來達成,printk的用法跟printf很像,只是printk要加入message的level(Ex: KERN_INFO, KERN_DEBUG)。

To be continued....