Linux驱动开发框架
1、驱动分为四个部分
1)头文件
#include <linux/init.h> //包含宏定义的头文件
#include <linux/module.h> //包含初始化加载模块的头文件
2)驱动模块的入口函数和出口函数
module_init(入口函数名);
module_exit(出口函数名);
3)声明信息
MODULE_LICENSE("GPL");
4)函数的功能实现
//入口函数
static int hello_init(void){
printk("hello world! \n");
return 0;
}
//出口函数
static void hello_exit(void){
printk("gooodbye! \n");
}
2、模块操作基本指令
insmod -------加载模块(调用模块加载函数)
insmod 模块路径
rmmod -------- 卸载模块(调用模块卸载函数)
rmmod 模块路径
rmmod时如果出错:rmmod: remove 'cdd1': No such file or directory
使用lsmod查看一下模块名,再次卸载模块
lsmod ------- 查看当前已经加载的模块
lsmod
3、Makefile demo
#内核源代码路径
KERNEL_DIR=/home/xxxx/kernel
#交叉编译器的路径(前缀)
CROSS_PATH=/home/xxxx/bin/arm-eabi-
#编译成模块,obj-m编译成模块
obj-m += first.o
default:
$(MAKE) ARCH=arm CROSS_COMPILE=$(CROSS_PATH) -C $(KERNEL_DIR) M=$(PWD) modules
clean:
rm -rf *.o *.ko *.mod* *.ord* *.sy* .*cmd .tmp*
4、内核模块编程的注意事项:
1、不能使用C库和C标准头文件;
2、使用GUN C
3、没有内存保护机制
4、不能处理浮点运算
5、注意并发互斥性和可移植型