内存管理器(十四)内核模块常用标识EXPORT_SYMBOL
前言
最近在看slab 的源码,发现了这个标识EXPORT_SYMBOL 。不是很理解,后来查了资料才明白了这个标识的作用是用来引用不同模块之间函数的标记。
__START
简要说明下吧。有函数fun1 在模块mod1 中,mod2模块中也有这个函数,但是mod2怎么引用这个函数呢?这个标识就是解决这个问题的。
首先在模块mod1中fun1下边的使用这个符号EXPORT_SYMBOL(fun1); 然后在模块2mod2 中extern 引用这个函数,模块2就可以适用了。
代码如下:
[c]
#include<linux/module.h>
#include<linux/slab.h>
#include<linux/mm.h>
#include<linux/list.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("zmrlinux");
MODULE_DESCRIPTION("some thing about EXPORT_SYMBOLY");
static int test1(void){ /*测试函数,在模块2中会被引用到*/
printk("HI i am in test1\n");
return 0;
}
EXPORT_SYMBOL(test1); /*函数引用*/
static int __init test_module(void){
printk("i am the first module\n");
test1();
return 0;
}
static void __exit test_out(void){
printk("module1 is goon\n");
}
module_init(test_module);
module_exit(test_out);
[/c]
[c]
#include<linux/module.h>
#include<linux/list.h>
#include<linux/types.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("zmrlinux");
MODULE_DESCRIPTION("something about SYMOBLE");
extern int test1(void); /*模块2引用模块1 的函数*/
static int __init TEST(void){
printk("i am the second mod\n");
test1();
return 0;
}
static void __exit TEST_out(void){
printk("do nothing\n");
}
module_init(TEST);
module_exit(TEST_out);
[/c]
Makefile 这里只写一个,另一个类似
[c]
obj-m := mod2.o
CURRENT_PATH := ${shell pwd}
CURRENT_KERNEL_PATH := ${shell uname -r}
LINUX_KERNEL_PATH := /usr/src/kernels/$(CURRENT_KERNEL_PATH)
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
rm *.o
[/c]
这个是预期的效果,完全符和我们说的效果。