准备材料:
内核包 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,将它下载到你的开发板
实验结果