嵌入式开发第61日(linux内核模块之设备驱动:怎么写一个简单的驱动)

准备材料:

内核包         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,将它下载到你的开发板

实验结果



猜你喜欢

转载自blog.csdn.net/reasonss/article/details/52911358
今日推荐