驱动第一发:hello world模块

来自个人维基
2015年5月6日 (三) 16:11Hovercool讨论 | 贡献的版本

(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

在编写代码之前,先要建立内核树,这里暂不予以讨论。

编译一个模块一般至少包括两个部分:

  • 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