标签:
统计单词个数的功能是封装在Linux驱动中的。
Linux驱动
Linux系统将每一个驱动都映射成一个文件,为设备文件或驱动文件,都保存在/dev目录中。与Linux驱动交换数据变成了与设备文件交换数据。
编写Linux驱动程序的步骤
1.建立Linux驱动骨架(装载和卸载Linux驱动):module_init(装载) module_exit(卸载)
2.注册和注销设备文件:建立设备文件的工作一般在第一步编写的处理Linux初始化工作的函数中完成;删除设备文件一般在第一步编写的处理Linux退出工作的函数中完成。misc_register(创建)misc_deregister(移除)
3.指定与驱动相关的信息:驱动程序是自描述的。
4.指定回调函数:Linux驱动包含了多种动作(事件),触发事件时Linux驱动会调用对应驱动程序的回调函数。一个驱动程序并不一定要指定所有的回调函数,回调函数会通过相关机制进行注册。
5.编写业务逻辑:Linux驱动核心。
6.编写Makefile文件:Linux内核源代码的编译规则是通过Makefile文件定义的。
7.编写Linux驱动程序:可直接编译进内核,也可作为模块单独编译。
8.安装和卸载Linux驱动:Linux驱动程序以模块单独存在时,需使用insmod或modprobe命令装载Linux驱动模块,使用rmmod命令卸载Linux驱动模块。使用lsmod命令查看是否成功安装。
统计单词个数
利用设备文件作为介质与应用程序进行交互,应用程序通过向设备文件传递一个由空格分隔的字符串,然后从设备文件读出来的是该字符串包含的单词数。
准备工作:
1.建立存放Linux驱动程序的目录:
“mkdir -p /root/drivers/ch06/word_count”
“cd /root/drivers/ch06/word_count”
2.建立驱动源代码文件:“echo ‘ ’ > word_count.c”
3.编写Makefile文件:“echo ‘obj-m := word_count.o’ > Makefile”
obj-m表示将Linux驱动作为模块(.ko文件)编译,obj-y表示将Linux驱动编译进Linux内核。两者都需使用“:=”赋值。使用obj-y,.o文件会被连接进built-in.o文件连接进内核。built-in.o文件是连接同一类程序的.o文件生成的中间目标文件。“make menuconfig”可配置每一个驱动及其他内核程序是否允许编译进内核。当驱动依赖其他程序时,依赖文件要使用module-y或module-objs指定(module表示模块名)。
编写骨架
骨架部分主要是Linux驱动的初始化和退出函数。
printk函数用于输出日志信息。printf 函数运行在用户空间,printk函数运行在内核空间,属于内核程序的Linux驱动不能直接访问printf函数。使用dmesg命令查看由Linux驱动输出的日志信息。
指定与驱动相关信息
modinfo命令查看信息,depends表示当前驱动模块的依赖,vermagic表示当前Linux驱动模块在哪个Linux内核版本下编译。
模块作者:MODULE_AUTHOR
模块描述:MODULE_DESCRIPTION
模块别名:MODULE_ALIAS
开源协议:MODULE_LICENSE(GPL协议、LGPL协议、BSD协议、Apache Licence 2.0协议、MIT协议)
注册和注销设备文件
设备文件需要一个结构体(miscdevice)来描述与其相关的信息,其成员变量fops用于描述设备文件在各种可触发事件的函数指针,其数据类型也是一个结构体file_operations。使用misc_register函数只能设置次设备号。主设备号为10的设备是Linux系统中拥有共同特性的简单字符设备,称为misc设备。
“cat /proc/devices”命令可显示当前系统中有哪些主设备以及主设备号。
指定回调函数
用户空间的应用程序与内核空间的驱动程序交互最长用的方式是读写设备文件,通过file_operations.read和file_operations.write成员变量可以分别指定读写设备文件要调用的回调函数指针。
实现统计单词数的算法
编译、安装、卸载Linux驱动程序
insmod和modprobe的区别是modprobe命令可以检查驱动模块的依赖性。使用modprobe命令装载驱动模块之前需先使用depmod命令检测Linux驱动模块的依赖关系。depmod命令必须使用Linux驱动模块(.ko文件)的绝对路径,其会将内核模块的依赖信息写入当前正在使用的内核的modules.dep文件。Modprobe命令只需使用驱动名称,不需要跟.ko。
测试Linux驱动
使用Ubuntu Linux测试:编写专门用于测试的程序。
在Android模拟器上通过原生(Native)C程序测试
1.将驱动模块安装在模拟器上:执行build.sh脚本,并选择Android模拟器,脚本会自动将.ko文件上传到Android模拟器的/data/local目录。
2.用于Android模拟器的goldfish内核默认不允许动态装载Linux驱动模块,因此需在编译Linux内核前执行命令“cd ~/kernel/goldfish”“make menuconfig”配置Linux内核。执行该命令后,如图,进入设置界面,按空格键将第二项“Enable loadable module support”选中,然后回车进入子菜单,选中前三项,保存设置并退出。
3.重新编译Linux内核,成功编译后Android模拟器可以使用新生成的zImage内核文件动态装载Linux驱动模块。
4.执行build.sh脚本文件完成对驱动的编译、上传和安装工作,进入Android模拟器终端使用echo和dmesg命令测试驱动查看结果。
5.在Android模拟器上使用C/C++程序进行测试:需有root权限,可执行文件需使用交叉编译器进行编译,以便支持ARM处理器。
使用Android NDK测试
使用Java代码直接操作设备文件测试:需要拥有root权限。
将驱动编译进Linux内核进行测试
标签:
原文地址:http://www.cnblogs.com/xuecheYBYB/p/5561070.html