本文的目的在分析清楚Linux下module的来龙去脉,相关的code均来自于Linux Kernel 2.6.23. 这个版本现在来说是比较老的版本了,以后有时间我会重新review一下最新的Kernel版本并更新之。但是我个人认为应该大同小异。
先看一个最简单的Hello World Example,该例子来自于LDD[1]第二章节,为了方便阅读,这里我原文拷贝了这个例子:
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
其Makefile文件内容为:
# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)