准备材料:
内核包 android-kernel-samsung-dev.tar.bz2
交叉编译库 arm-2009q3.tar.bz2
开发板运行的内核,必须跟驱动编写所使用的是同一个内核包
书籍推荐:
Linux设备驱动程序(中文版第三版) -歪果仁
深入Linux设备驱动程序内核机制 -陈雪松
linux内核模块编程特点:
1.不能使用C库和C标准头文件2.必须使用GNU规范
3.没有内存保护机制
4.不能处理浮点运算
5.注意同步和并发的问题
6.注意可移植性
模块的操作命令
insmod
加载模块,内核会执行模块加载函数
rmmod
卸载模块,内核会执行模块卸载函数
lsmod
查看当前已加载的模块
modinfo
查看模块信息
modprobe
加载模块,内核会执行模块加载函数
modprobe和insmod的区别
modprobe需要模块信息文件的支持modules.dep,modprobe还会检查模块的依赖,自动加载依赖的模块,insmod则没有这些性质
modinfo也需要modules.dep的支持
编写Makefile
KERNELDIR ?= /home/student/arm_lesson/android-kernel-samsung-dev obj-m += hello.o default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean: rm -rf *.o *.ko *.mod* *.sy* *.ord* .*cmd .tmp*
hello.c
#include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("GPL v2");//遵循开源的声明,如果不加,内核提示警告信息,内核有些函数将无法使用
int __init hello_init(void)//加载函数 { printk("hello everyone!\n"); return 0; } void __exit hello_exit(void)//卸载函数 { printk("bye bye!\n"); } module_init(hello_init);//使用module_init和module_exit修饰,告诉内核模块的加载函数和卸载函数 module_exit(hello_exit);
生成一个 hello.ko,将它下载到你的开发板