内存管理器(十四)内核模块常用标识EXPORT_SYMBOL

内存管理器(十四)内核模块常用标识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]

 

这个是预期的效果,完全符和我们说的效果。

2015-11-10 17:51:03 的屏幕截图

查看原文:http://zmr.lezifang.cn/2015/11/10/%e5%86%85%e5%ad%98%e7%ae%a1%e7%90%86%e5%99%a8%ef%bc%88%e5%8d%81%e5%9b%9b%ef%bc%89%e5%86%85%e6%a0%b8%e6%a8%a1%e5%9d%97%e5%b8%b8%e7%94%a8%e6%a0%87%e8%af%86export_symbol/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值