分类: 嵌入式
2010-08-04 00:27:23
实验目的是从module1.ko导出函数module1_export_symbol1,module2.ko中使用该函数。
module1.c
#include
#include
MODULE_LICENSE("Dual BSD/GPL");
static int module1_init(void)
{
printk(KERN_ALERT "Enter module1_init\n");
return 0;
}
static void module1_exit(void)
{
printk(KERN_ALERT "Enter module1_exit\n");
}
int module1_export_symbol1(int a)
{
printk(KERN_ALERT "==============================\n");
printk(KERN_ALERT "a = %d\n",a);
printk(KERN_ALERT "==============================\n");
return 0;
}
module_init(module1_init);
module_exit(module1_exit);
EXPORT_SYMBOL(module1_export_symbol1);
module2.c
#include
#include
MODULE_LICENSE("Dual BSD/GPL");
extern int module1_export_symbol1(int a);
static int module2_init(void)
{
printk(KERN_ALERT "Enter module2_init\n");
module1_export_symbol1(123);
return 0;
}
static void module2_exit(void)
{
printk(KERN_ALERT "Enter module2_exit\n");
}
module_init(module2_init);
module_exit(module2_exit);
Makefile
obj-m := module1.o module2.o
module-objs := module1.o module2.o
KERNELDIR = /lib/modules/$(shell uname -r)/build
PWD = $(shell pwd)
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *~ *.o *.mod.c *.markers *.symvers *.order module1.ko module2.ko
insmod module1.ko 后出现日志信息“Aug 3 09:01:41 ubuntu kernel: [23158.226786] Enter module1_init”
insmod module2.ko后出现日志信息
“Aug 3 09:01:52 ubuntu kernel: [23168.827169] Enter module2_init
Aug 3 09:01:52 ubuntu kernel: [23168.827211] ==============================
Aug 3 09:01:52 ubuntu kernel: [23168.827230] a = 123
Aug 3 09:01:52 ubuntu kernel: [23168.827250] ============================== “
rmmod module2后将出现日志信息“Aug 3 09:09:32 ubuntu kernel: [23628.450063] Enter module2_exit”
rmmod module1后将出现日志信息“Aug 3 09:09:46 ubuntu kernel: [23642.554509] Enter module1_exit”
本实验只是一个简单的内核模块符号导出和使用的例子,复杂的驱动都会将驱动分层,以便提高开发效率和设计灵活性,以及将操作硬件部分与驱动上层分开。这样的驱动会结合autoconfig来配置可移植的软件包。