下面是基本上取自于 Linux Device Driver 3的hello, world的例子。做了一点小小的改变。实质适应ubuntu kernel的编译。
环境:ubuntu 10.04
Kernel: 2.6.32-21-generic , 可以通过 uname -r 查看
gcc版本: 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
一. 准备工作
安装内核头文件
sudo apt-get install linux-headers-$(uname -r)
|
二. 编写代码 hello.c
#ifndef __KERNEL__ #define __KERNEL__ #endif
#ifndef MODULE #define MODULE #endif
#include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h>
MODULE_LICENSE("GPL"); static int hello_init(void) { printk(KERN_ALERT "Hello World!\n"); return 0; }
static void hello_exit(void) { printk(KERN_ALERT "Bye World!\n"); }
module_init(hello_init); module_exit(hello_exit);
|
三. 编写Makefile 文件,与hello.c 放在同一个目录里
obj-m := hello.o KERNELBUILD :=/lib/modules/`uname -r`/build all: make -C $(KERNELBUILD) M=$(shell pwd) modules clean: rm -rf *.o *.ko *.mod.c .*.cmd .tmp_versions |
(注意makefile里面要求的tab)
四. 编译模块
# make
make -C /lib/modules/`uname -r`/build M=/root/programs/km modules make[1]: 正在进入目录 `/usr/src/linux-headers-2.6.32-21-generic' CC [M] /root/programs/km/hello.o Building modules, stage 2. MODPOST 1 modules CC /root/programs/km/hello.mod.o LD [M] /root/programs/km/hello.ko make[1]:正在离开目录 `/usr/src/linux-headers-2.6.32-21-generic'
|
这时,在hello.c 所在文件夹就会有 hello.ko ,这个就是我们需要的内核模块
五. 运行/终止模块
我们用dmesg 就可以看到 产生的内核信息啦,Hello world!
再用dmesg 可以看到 Bye world!
六. 删除模块
清理编译垃圾,hello.ko 也会清理掉。
注:如果在模块程序中不加入:
在编译时会出现如下问题:
[70685.298483] hello: module license 'unspecified' taints kernel.
[70685.298673] Disabling lock debugging due to kernel taint
|
阅读(4731) | 评论(0) | 转发(0) |