Linux模块编程机制之hello kernel
Linux模块编程机制之hello kernel
看了那么多理论知识,可能还是一头雾水,是啊,纯理论分析本来就不好理解。为了更好的理解Linux内核各种内部机制以及其运用,在接下来的学习中将采用理论+实验+源码注释的方式进行。包括算法、原理的实验,内核的局部扩展与修改等。Linux内核编程有很多方法,最方便的方式是使用内核提供的模块编程机制,另一种方式是以补丁的方式,这种方式只需要编译一次内核,当然也可以直接修改内核源码,但是每次修改后都需要重新编译、引导、重启,很麻烦,也很费时。首先,我们看看最方便快捷的一种方式——LINUX内核中模块编程机制。
还是从程序员的哪个起步程序hello world开始,但是我们这里比一般的hello world稍微复杂一点,用两个hello world程序。
文件hello.c
- #include <linux/init.h>
- #include <linux/module.h>
- #include <linux/kernel.h>
- MODULE_LICENSE("GPL");
- extern int hello_data;
- static int hello_init(void)
- {
- printk(KERN_ERR "hello,kernel!,this is hello module\n");
- printk(KERN_ERR "hello_data:%d\n",++hello_data);
- return 0;
- }
- static void hello_exit(void)
- {
- printk(KERN_ERR "hello_data:%d\n",--hello_data);
- printk(KERN_ERR "Leave hello module!\n");
- }
- module_init(hello_init);
- module_exit(hello_exit);
- MODULE_AUTHOR("Mike Feng");
- MODULE_DESCRIPTION("This is hello module");
- MODULE_ALIAS("A simple example");
对应的Makefile文件:
- obj-m +=hello.o
- CURRENT_DIR:=$(shell pwd)
- KERNEL_DIR:=$(shell uname -r)
- KERNEL_PATH:=/usr/src/kernels/$(KERNEL_DIR)
- all:
- make -C $(KERNEL_PATH) M=$(CURRENT_DIR) modules
- clean:
- make -C $(KERNEL_PATH) M=$(CURRENT_DIR) clean
文件hello_h.c:
- #include <linux/init.h>
- #include <linux/module.h>
- #include <linux/kernel.h>
- MODULE_LICENSE("GPL");
- static unsigned int hello_data=100;
- EXPORT_SYMBOL(hello_data);
- static int hello_h_init(void)
- {
- hello_data+=5;
- printk(KERN_ERR "hello_data:%d\nhello kernel,this is hello_h module\n",hello_data);
- return 0;
- }
- static void hello_h_exit(void)
- {
- hello_data-=5;
- printk(KERN_ERR "hello_data:%d\nleave hello_h module\n",hello_data);
- }
- module_init(hello_h_init);
- module_exit(hello_h_exit);
- MODULE_AUTHOR("Mike Feng");
对应的Makefile
- obj-m+=hello_h.o
- CURRENT:=$(shell pwd)
- KERNEL_PATH:=/usr/src/kernels/$(shell uname -r)
- all:
- make -C $(KERNEL_PATH) M=$(CURRENT) modules
- clean:
- make -C $(KERNEL_PATH) M=$(CURRENT) clean
可见,我们在hello_h.c中定义了一个静态变量hello_data,初始值为100,并把他导出了,在hello.c中使用了该变量。这样给出例子,后面我们会看到,是为了说明模块依赖。
|
评论暂时关闭