1。创建hello目录
mkdir hello
2。进入hello目录
cd hello
3。编写hello.c
#include <linux/init.h>
#include <linux/module.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 "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
4。编写Makefile文件
obj-m := hello.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
5。在当前目录下make:
/home/jb/hello# make
成功的结果如下:
make -C /lib/modules/2.6.32-35-generic/build M=/home/jb/hello modules
make[1]: 正在进入目录 `/usr/src/linux-headers-2.6.32-35-generic'
Building modules, stage 2.
MODPOST 1 modules
make[1]:正在离开目录 `/usr/src/linux-headers-2.6.32-35-generic'
同时目录下有文件 hello.ko 生成 。
如果出现下面的错误:
make: Nothing to be done for `default'
解决办法:
检查Makefile文件:
obj-m := hello.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
看看
$(MAKE) -C $(KDIR) M=$(PWD) modules 前面是不是有tab键空格
6。加载helloworld模块
sudo insmod hello.ko
7。卸载helloworld模块
sudo rmmod hello.ko
8。查看输出信息:
/home/jb/hello# cat /var/log/kern.log | tail -8
或者
/home/jb/hello#dmesg | tail -8
结果如下:
[ 1195.255925] input: USB OPTICAL MOUSE as /devices/pci0000:00/0000:00:1d.0/usb2/2-2/2-2:1.0/input/input11
[ 1195.256119] generic-usb 0003:15D9:0A4C.0005: input,hidraw0: USB HID v1.11 Mouse [ USB OPTICAL MOUSE] on usb-0000:00:1d.0-2/input0
[ 1196.580072] [drm:radeon_fence_wait] *ERROR* fence(c80d6060:0x0000793D) 504ms timeout going to reset GPU
[ 1196.580288] [drm] GPU reset succeed (RBBM_STATUS=0x00000140)
[ 1196.580299] [drm:radeon_fence_wait] *ERROR* fence(c80d6060:0x0000793D) 512ms timeout
[ 1196.580308] [drm:radeon_fence_wait] *ERROR* last signaled fence(0x0000793D)
[ 1470.581094] Hello, world
[ 1476.732844] Goodbye, cruel world