第六章 第一个Linux驱动程序: 统计单词个数
一、编写Linux驱动程序的步骤
第1 步:建立Linux 驱动骨架(装载和卸载Linux 驱动)
骨架部分主要是Linux驱动的初始化和退出函数,代码如下:
#include <linux/module.h>
#include <linux/init .h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <asm/uaccess .h>
// 初始化Linux 驱动
static int word_count_init(void)
{
//输出日志信息
printk(“work_count_init_success\n”);
return 0;
}
//退出Linux 驱动
static void word_count_exit(void)
{
// 输出日志信息
printk (”word_count_init_exit_success\n”);
}
// 注册初始化Linux 驱动的函数
module_init(word_count_init);
//注册退出Linux 驱动的函数
module_exit (word_count_exit);
第2 步:注册和注销设备文件
# insmod word_count.ko //安装Linux驱动
# lsmmod | grep word_count //查看word_count 是否成功安装
# rmmod word_count //卸载Linux 驱动
# dmesg | grep word_count | tail –n 2 //查看由Linux 驱动输出的日志信息.
也可以执行下面的命令获取自Linux 驱动输出的日志信息。
# cat /var/log/syslog | grep word_count | tail -n 2
第3 步:指定与驱动相关的信息
模块作者:使用MODULE_AUTHOR 宏指定。
模块描述:使用MODULE_DESCRIPTION 宏指定。
模块别名:使用MODULE_ALIAS 宏指定。
开源协议: 使用MODULE_LICENSE 宏指定。
第4 步:指定回调函数
不管Linux 驱动程序的功能多么复杂还是多么“酷”,都必须允许用户空间的应用程序与内核空间的驱动程序进行交互才有意义。而最常用的交互方式就是读写设备文件。通过file_operations.read 和file_operations. write 成员变量可以分别指定读写设备文件要调用的回调函数指针。
第5 步:编写业务逻辑
第6 步:编写Makefile 文件
第7 步:编译Linux 驱动程序
第8 步:安装和卸载Linux 驱动
在使用modprobe 命令装载驱动模块之前, 需要先使用 depmod 命令检测Linux驱动模块的依赖关系。
使用- depmod 命令检测完依赖关系后,就可以调用ufodprobe 命令装载Linux 驱动。
# modprobe word_count
如果将Linux 驱动编译进内核,只要Linux 使用该内核,驱动程序就会自动装载。如果Linux
驱动程序以模块单独存在, 需要使用insmod 或modprobe 命令装载Linux 驱动模块,使用rmmod
命令卸载Linux 驱动模块。
上面8 步中的前5 步是关于如何编写Linux 驱动程J字的,通过后3 步可以使Linux 驱动正常工作。
Linux下 JNI的使用
学习Android其中涉及对JNI的使用,对于这种跨语言的调用真没有见过,Java也都是最近才学的更别说对JNI的了解了,
JNI的使用对于Android来说又是十分的重要和关键。那么到底Java到底是如何调用C/C++的,通过网络达人的总结中学习,自己也顺便总结一下这个学习的过程。
什么是JNI
JNI是Java native interface的简写,可以译作Java原生接口。Java可以通过JNI调用C/C++的库,这对于那些对性能要求比较高的Java程序无疑是一个福音。JNI是Java与C/C++交互的接口。
使用JNI也是有代价。大家都知道JAVA程序是运行在JVM之上的,可以做到平台无关。但是如果Java程序通过JNI调用了原生的代码(比如c/c++等),则Java程序就丧失了平台无关性。最起码需要重新编译原生代码部分。所以应用JNI需要好好权衡,不到万不得已,请不要选择JNI,可以选择替代方案,比如TCP/IP进行进程间通讯等等。这也是为什么谷歌的Android平台的底层虽然用JNI实现,但是他不建议开发人员用JNI来开发Android上面的应用的原因。将会丧失Android上面的应用程序平台无关性。