一个简单的内核模块编程实例

学习netfilter的使用,需要用到模块编程,所以先学习写个模块的例子。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

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

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

module_init(hello_init);
module_exit(hello_exit);

MODULE_AUTHOR("tonybuaa");
MODULE_LICENSE("Dual BSD/GPL");
MODULE_DESCRIPTION("hello module");
MODULE_ALIAS("a smiplest module");

Makefile文件是这样的:

ifeq ($(KERNELRELEASE),)
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
    rm -rf *.o *.mod.c *.ko modules.order Module.symvers
else
    obj-m := hello.o
endif

执行make:

tony@ubuntu-a:~/code/module_test$ make
make -C /lib/modules/3.8.0-19-generic/build M=/home/tony/code/module_test modules
make[1]: 正在进入目录 `/usr/src/linux-headers-3.8.0-19-generic'
  CC [M]  /home/tony/code/module_test/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/tony/code/module_test/hello.mod.o
  LD [M]  /home/tony/code/module_test/hello.ko
make[1]:正在离开目录 `/usr/src/linux-headers-3.8.0-19-generic'

安装内核模块:

tony@ubuntu-a:~/code/module_test$ sudo insmod ./hello.ko

使用dmesg | tail查看内核日志打印信息:

tony@ubuntu-a:~/code/module_test$ dmesg | tail
[13270.772001] call hello_init

卸载内核模块:

tony@ubuntu-a:~/code/module_test$ sudo rmmod hello

再次查看内核日志:

tony@ubuntu-a:~/code/module_test$ dmesg | tail
[13270.772001] call hello_init
[13337.794110] call hello_exit

 

 

posted on 2013-04-30 17:35  tonybuaa  阅读(378)  评论(0编辑  收藏  举报

导航