8.20 模块间通信(上):全局变量
共享全局变量
全局变量的作用域
全局变量的定义与声明
//module1
int globale_val;
//module2
extern int globale_val;
//module3
extern int globale_val;
在Linux内核中共享全局变量
- 通过EXPORT_SYMBOL导出全局变量
- 在内核中新增头文件声明
- 通过函数接口来引用全局变量
代码
module1
#include<linux/init.h>
#include<linux/module.h>
MODULE_LICENSE("GPL");
int global_val = 10;
EXPORT_SYMBOL(global_val); //通过EXPORT_SYMBOL导出全局变量
int get_global_val_value(void) //通过函数接口来引用全局变量
{
return global_val;
}
int set_global_val_value(int a) //通过函数接口来引用全局变量
{
global_val = a;
}
static int module1_init(void)
{
printk("hello module1!\n");
printk("module1:global_val = %d\n",global_val);
return 0;
}
static void __exit module1_exit(void)
{
printk("goodbye, module1!\n");
}
module_init(module1_init);
module_exit(module1_exit);
makefie1
.PHONY:all clean
ifneq ($(KERNELRELEASE),)
obj-m := module1.o
else
EXTRA_CFLAGS += -DDEBUG
#KDIR := /lib/modules/4.4.0-62-generic/build
KDIR := /home/linux-4.4 //内核源码所在目录
all:
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm -C $(KDIR) M=$(PWD) modules
cp module1.ko /home/nfs
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order
endif
module2
#include<linux/init.h>
#include<linux/module.h>
#include<asm/module1.h>
MODULE_LICENSE("GPL");
//extern int global_val;
static int module2_init(void)
{
printk("hello module2!\n");
printk("module2:global_val = %d\n",global_val);
return 0;
}
static void __exit module2_exit(void)
{
printk("goodbye, module2!\n");
}
module_init(module2_init);
module_exit(module2_exit);
makefile2
.PHONY:all clean
ifneq ($(KERNELRELEASE),)
obj-m := module2.o
else
EXTRA_CFLAGS += -DDEBUG
#KDIR := /lib/modules/4.4.0-62-generic/build
KDIR := /home/linux-4.4
all:
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm -C $(KDIR) M=$(PWD) modules
cp module2.ko /home/nfs
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order
endif
module1.h的放置
可以放在一些常见的系统目录
- linux4.4/include/linux
#include <linux/module1.h>
- linux4.4/arch/arm/include/asm
#include <asm/module1.h>
内核中的全局变量(宏)
Current指针
Jiffies
HZ
tick