驱动程序的几个实例采用宏定义函数实现,用来在测试模式下输出
ssize_t DriverRead(struct file *pslFileStruct, char __user *pBuffer, size_t nCount, loff_t *pOffset) { DEBUG_PRINT(DEVICE_NAME ": read invoked, do nothing\n"); return 0; }
//这里是头文件中的宏定义函数
#ifdef TEST_DEBUG #define DEBUG_PRINT_LINE(...) do{printk(KERN_ALERT "ErrLine : %s::%d\nErrorInfo : ", __FILE__, __LINE__); printk(KERN_ALERT __VA_ARGS__);}while(0) #define DEBUG_PRINT(...) printk(KERN_ALERT __VA_ARGS__) #else #define DEBUG_PRINT_LINE(...) #define DEBUG_PRINT(...) #endif
编译的Makefile函数如下
ifneq ($(KERNELRELEASE),) obj-m := PrintModule.o PrintModule-objs := DriverMain.o DriverFileOperations.o ToolFunctions.o EXTRA_CFLAGS := -DTEST_DEBUG -ggdb -O0 else KERNELDIR ?= /lib/modules/$(shell uname -r)/build #KERNELDIR ?= /root/kernelsrc/linux-3.13 PWD := $(shell pwd) default: $(MAKE) -C $(KERNELDIR) M=$(PWD) rm *.order *.symvers *.mod.c *.o .*.o.cmd .*.cmd .tmp_versions -rf endif
首先检查KERNELRELEASE是否被定义,一开始是没有的所以直接跳过到else,根据系统对KERNELDIR和PWD赋值,接着开始执行default后的命令
在这里执行MAKE操作,-C切换到KERNELDIR文件夹下,也就是执行KERNELDIR里的顶层Makefile
在该Makefile中,定义了KERNELRELEASE, M:表示在构造模块之前,回到目录PWD,再次执行当前目录下的Makefile 执行过程中EXTRA_CFLAGS:=-D 定义了程序是在TEST_DEBUG宏作用下
*如果KERNELRELEASE被定义了,则程序只会执行一次循环而不会再次执行default,否则一直循环直到KERNELRELEASE被定义
**这是通过什么措施实现的?不理解