异想天开

What's the true meaning of light, Could you tell me why

linux模块编程

日期:2014-03-23 22:05:12
  
最后更新日期:2015-06-11 20:12:40
概述:
第一次接触内核模块,先尝试写个hello world的例子。这个例子很简单,但也多了花了几分钟,主要是对照了网上某篇文章的那个makefile写的疏漏了,或者是作者打字漏了,所以希望对于这篇小记也不要抱已全部相信的态度。如果你此刻很有耐心,那么建议不要看下去了,直接看Documentation的kbuild目录下的modules.txt。
1.Makefile,在这里好像这个大小写有点关系:
[code lang="cpp"]
ifneq ($(KERNELRELEASE),)
obj-m = hello.o
else
KVERSION = $(shell uname -r)
PWD = $(shell pwd)
default:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean
endif
[/code]
2.建个hello目录,然后编辑如下hello.c:
[code lang="cpp"]
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
#include <linux/init.h> /* Needed for the macros */
static int __init hello_start(void)
{
printk(KERN_INFO "Loading hello module...\n");
printk(KERN_INFO "Hello world\n");
return 0;
}
static void __exit hello_end(void)
{
printk(KERN_INFO "Goodbye Mr.\n");
}
MODULE_LICENSE("GPL");
module_init(hello_start);
module_exit(hello_end);
[/code]
注意:
__init属性和__exit属性

3.验证效果,正确情况会在目录会出现一个hello.ko:
[code lang="cpp"]
sudo inmod hello.ko
dmesg | tail
sudo rmmod hello.ko
[/code]
参考:
1.编译内核模块(注:该文有少许错误)