Chinaunix首页 | 论坛 | 博客
  • 博客访问: 522033
  • 博文数量: 68
  • 博客积分: 2501
  • 博客等级: 大尉
  • 技术积分: 713
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-07 17:49
个人简介

文章分类

全部博文(68)

分类: LINUX

2010-05-20 11:34:55

模块间的符号引用实例

一、Makefile
加入obj-m :=func_dev.o export.o

二、加截顺序和卸载顺序
1.先加载func_dev.ko,再加载export.ko。。
2.与加载时相反,先卸载export.ko,再卸载func_dev.ko。

三、执行结果
1.加载func_dev.ko后执行
cat /proc/kallsyms  |grep func_dev
出现以下内容
00000000 a func_dev.c [func_dev]
f8b91104 ? __mod_license34 [func_dev]
f8b060d0 r __ksymtab_func_sum [func_dev]
f8b060e8 r __kstrtab_func_sum [func_dev]
f8b060d8 r __ksymtab_func_var2 [func_dev]
f8b060f1 r __kstrtab_func_var2 [func_dev]
f8b060e0 r __ksymtab_func_var1 [func_dev]
f8b060fb r __kstrtab_func_var1 [func_dev]
00000000 a func_dev.mod.c [func_dev]
f8b9111c ? __mod_srcversion23 [func_dev]
f8b91140 ? __module_depends [func_dev]
f8b9114c ? __mod_vermagic5 [func_dev]
f8b07684 B func_var2 [func_dev]
f8b06500 d __this_module [func_dev]
f8b06000 t cleanup_module [func_dev]
f8b06010 t init_module [func_dev]
f8b06000 t func_exit [func_dev]
f8b07680 B func_var1 [func_dev]
c06a5848 u printk [func_dev]
f8b06010 t func_init [func_dev]
f8b06021 T func_sum [func_dev]
2.执行dmesg查看日志缓存中记录内容
func init...
export call init...
func_var1=3
func_var2=4
var3 =5
3+4+5=12
export call exit...
func exit...
 
实例源代码
export.c源码
#include
#include
#include
extern int func_var1;
extern int func_var2;
extern int func_sum(int var3);
int export_init(void)
{
    printk("export call init...\n");
    func_var1=3;
    func_var2=4;
    printk("%d+%d+5=%d\n",func_var1,func_var2,func_sum(5));
    return 0;
}
void export_exit(void)
{
    printk("export call exit...\n");
}
module_init(export_init);
module_exit(export_exit);
MODULE_LICENSE("Dual BSD/GPL");
 
 
func_dev.c源码
#include
#include
#include
int func_var1=0;
int func_var2=0;
int func_sum(int var3)
{
    printk("func_var1=%d\n",func_var1);
    printk("func_var2=%d\n",func_var2);
    printk("var3    =%d\n",var3);
    return (func_var1+func_var2+var3);
}
int func_init(void)
{
    printk("func init...\n");
    return 0;
}
void func_exit(void)
{
    printk("func exit...\n");
   
}
EXPORT_SYMBOL(func_var1);
EXPORT_SYMBOL(func_var2);
EXPORT_SYMBOL(func_sum);
module_init(func_init);
module_exit(func_exit);
MODULE_LICENSE("Dual BSD/GPL");
 
Makefile源码
ifneq ($(KERNELRELEASE),)
obj-m :=func_dev.o export.o
else
PWD := $(shell pwd)
KVR := $(shell uname -r)
KERNELDIR := /lib/modules/$(KVR)/build/ #内核源码目录
all:
 $(MAKE) -C $(KERNELDIR) M=$(PWD)  modules
clean:
 rm -rf *.o *~core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules*
endif
阅读(1423) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~