驱动第一发:hello world模块
在编写代码之前,先要建立内核树,这里暂不予以讨论。
编译一个模块一般至少包括两个部分:
- c源文件
//------------hello.c----------------------
#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
//------------Makefile----------------------
obj-m := hello.o
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules #注意前面必须为tab
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install #注意前面必须为tab
最后以root身份:
$:make
然后加载模块:
$:insmod ./hello.ko
卸载模块:
$:rmmod hello
查看 /var/log/syslog验证模块加载信息:
Feb 10 15:31:18 tgdn-1828 kernel: [ 190.982429] Hello world Feb 10 15:31:28 tgdn-1828 kernel: [ 200.771173] Goodbye, cruel world
或直接通过命令查看打印消息:
$:dmesg