Android系统篇之—-编写简单的驱动程序并且将其编译到内核源码中【转】
本文转载自:大神
通过之前的一篇文章,我们了解了 Android中的Binder机制和远程服务调用 在这篇文章中主要介绍了Android中的应用在调用一些系统服务的时候的原理,那么接下来就继续来介绍一下如何通过编译Android源码来手动添加一个系统服务,让编译之后的Android系统中存在我们的这个服务,每个应用都可以调用。但是本文得先介绍一下如何编写一个简单的驱动程序,先介绍了驱动程序,然后在通过JNI让framework层访问这个驱动程序,在通过注册服务来封装这个功能,最后在把这个服务添加到系统中,实现上层应用通过访问这个服务来操作驱动,当然你必须要掌握和了解 Android中如何编译源码 如果没有编译过Android源码的话,下面的内容将会看的很吃力的。
声明:本文内容参考罗升阳的书籍:《Android系统源代码情景分析》 如果想了解更详细的内容非常建议购买此书
非常感谢罗神的这本书,给我带来很多未知的知识,大神的博客地址:http://blog.csdn.net/luoshengyang
一、编写内核驱动小程序
这里不会介绍内核驱动小程序内容,因为没什么好说的,就是Linux系统api,然后在了解一下驱动的概念即可。这里主要介绍操作步骤,关于代码后面我会给出下载地址,感兴趣的同学可以自己详细看一下。
第一步:进入源码内核目录创建驱动程序目录
cd kernel/drivers
在这个目录中,我们新建一个我们自己的驱动目录freg:
看到这个目录中有很多系统的驱动程序。然后就在这个freg目录中编写驱动程序:
这里的freg.c就是驱动程序,这里,我们不会为真实的硬件设备编写内核驱动程序。为了方便描述为Android系统编写内核驱动程序的过程,我们使用一个虚拟的硬件设备,这个设备只有一个4字节的寄存器,它可读可写。
第二步:配置驱动程序编译信息
在freg目录中新增Kconfig和Makefile两个文件,其中Kconfig是在编译前执行配置命令make menuconfig时用到的:
而Makefile是执行编译命令make是用到的:
第三步:将驱动程序到系统配置中
上面配置完了驱动程序自身的编译信息,如果想把这个驱动程序编译到内核中,还需要配置内核信息,修改arch/arm/Kconfig和drivers/kconfig两个文件,在menu “Device Drivers”和endmenu之间添加一行:
source “drivers/hello/Kconfig”
这样,执行make menuconfig时,就可以配置hello模块的编译选项了。修改drivers/Makefile文件,添加一行:
第四步:编译内核驱动
在内核目录下运行命令:make menuconfig
“Device Drivers” => “First Android Drivers”选项,设置为y:
这样就编译驱动程序成功了,下面就开始编译内核源码
第五步:启动模拟器检查驱动程序
到源码的根目录中,运行命令:emulator -kernel ./kernel/common/arch/arm/boot/zImage &
有的同学可能会遇到这个错误,不过没关系,咋们在运行一下脚本文件:
如果运行成功的话,就可以看到模拟器了:
这时候,我们使用adb shell命令查看驱动程序的功能:
首先驱动程序肯定是存放在/dev目录中的,如果要进行操作驱动程序,需要到/proc目录中找到指定驱动程序,然后可以使用echo命令写入数据,cat命令读取数据。
到这里,我们就成功的编写了虚拟驱动程序,并且编译到内核中,通过命令访问也是测试通过了。这里采用的是系统提供的方法和驱动程序进行交互,也就是通过proc文件系统和devfs文件系统的方法。
二、编写内核驱动访问程序
有了上面的驱动程序内容,下面为了更好的方便操作这个驱动,我们可以在编写一个简单的C语言来直接访问这个驱动,而操作驱动的方法也很简单,使用open方法即可。
第一步:建立系统程序目录
进入/external/目录,新建一个freg程序目录:
第二步:编写操作驱动程序
这里的代码比较简单,在main函数中直接使用open打开驱动,然后就可以直接读写操作了
第三步:建立编译脚本,然后编译程序
在程序的同一目录下,创建编译脚本:Android.mk文件
参照如何单独编译Android源代码中的模块一文,使用mmm命令进行编译:
mmm ./external/freg
编译成功后,就可以在out/target/product/gerneric/system/bin目录下,看到可执行文件hello了。
重新打包Android系统文件system.img:
make snod
这样,重新打包后的system.img文件就包含刚才编译好的hello可执行文件了。
第四步:运行模拟器
运行模拟器的命令上面已经介绍了,这里就不在演示了,运行成功之后,就可以使用/system/bin/hello可执行程序来访问Linux内核驱动程序:
系统命令都是存放在/system/bin目录下的,我们可以看到找到我们编译的读取驱动的系统命令程序freg,然后可以运行这个程序进行驱动的读写操作了。到此就完成了使用C程序来操作驱动了。
项目案例代码:http://download.csdn.net/detail/jiangwei0910410003/9642364
三、总结
本文介绍了如何通过编译Android内核源码,来手动的编写一个简单的虚拟驱动程序,然后在写一个简单的C程序访问这个驱动,后续将会介绍如何在Framework层通过JNI来访问这个驱动。
Android系统篇之—-编写简单的驱动程序并且将其编译到内核源码中【转】的更多相关文章
- Android系统篇之—-编写系统服务并且将其编译到系统源码中【转】
本文转载自:http://www.wjdiankong.cn/android%E7%B3%BB%E7%BB%9F%E7%AF%87%E4%B9%8B-%E7%BC%96%E5%86%99%E7%B3% ...
- v86.01 鸿蒙内核源码分析 (静态分配篇) | 很简单的一位小朋友 | 百篇博客分析 OpenHarmony 源码
本篇关键词:池头.池体.节头.节块 内存管理相关篇为: v31.02 鸿蒙内核源码分析(内存规则) | 内存管理到底在管什么 v32.04 鸿蒙内核源码分析(物理内存) | 真实的可不一定精彩 v33 ...
- 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视GCC编译全过程 | 百篇博客分析OpenHarmony源码| v57.01
百篇博客系列篇.本篇为: v57.xx 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视编译全过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...
- 鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗 | 百篇博客分析OpenHarmony源码 | v61.02
百篇博客系列篇.本篇为: v61.xx 鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...
- 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程 | 百篇博客分析OpenHarmony源码 | v59.01
百篇博客系列篇.本篇为: v59.xx 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿 ...
- 鸿蒙内核源码分析(GN应用篇) | GN语法及在鸿蒙的使用 | 百篇博客分析OpenHarmony源码 | v60.01
百篇博客系列篇.本篇为: v60.xx 鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙的使用 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...
- 鸿蒙内核源码分析(静态站点篇) | 五一哪也没去就干了这事 | 百篇博客分析OpenHarmony源码 | v52.02
百篇博客系列篇.本篇为: v52.xx 鸿蒙内核源码分析(静态站点篇) | 五一哪也没去就干了这事 | 51.c.h.o 前因后果相关篇为: v08.xx 鸿蒙内核源码分析(总目录) | 百万汉字注解 ...
- 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙看这篇或许真的够了 | 百篇博客分析OpenHarmony源码 | v50.06
百篇博客系列篇.本篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉坑指南 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉 ...
- 鸿蒙内核源码分析(进程回收篇) | 老父亲如何向老祖宗临终托孤 ? | 百篇博客分析OpenHarmony源码 | v47.01
百篇博客系列篇.本篇为: v47.xx 鸿蒙内核源码分析(进程回收篇) | 临终前如何向老祖宗托孤 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管 ...
随机推荐
- 如何突破PHP程序员的技术瓶颈分析
来自:http://www.jb51.net/article/27740.htm 身边有几个做PHP开发的朋友,也接触到不少的PHP工程师,他们常疑虑自己将来在技术上的成长与发展,我常给他们一些建议, ...
- 【Python + Mysql】之用pymysql库连接Mysql数据库并进行增删改查操作
用pip下载pymysql并引用 具体请参考文章: <Python之MySQL数据库增删改查操作> <python3.6 使用 pymysql 连接 Mysql 数据库及 简单的增删 ...
- 深入了解Erlang 垃圾回收机制以及其重要性(转)
声明:本片文章是由Hackernews上的[Erlang Garbage Collection Details and Why ItMatters][1]编译而来,本着学习和研究的态度,进行的编译,转 ...
- jsonp 小结
JSONP是JSON with Padding的略称. 它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实 ...
- 走进Struts2(五)— 值栈和OGNL
值栈 1.值栈是什么? 简单说:就是相应每个请求对象的轻量级的内存数据中心. Struts2引入值栈最大的优点就是:在大多数情况下,用户根本无须关心值栈,无论它在哪里,不用管它里面有什么,仅仅须要去获 ...
- Linux tar包安装Nginx
1.首先安装依赖包(依赖包有点多.我们採用yum的方式来安装) yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel ...
- 使用Highcharts实现柱状图展示
第一步 新建页面line.html,引入HighCharts核心js文件 <script type="text/javascript" src="../../js/ ...
- java工程中当前目录在html中的设置
本地启动server的时候总是去读"/"的, 但到了服务器上,如果当前目录是服务器根目录下的一个文件夹,就应该设: <head> <meta charset=&q ...
- zendstudio的安装和破解
参考博客地址:http://www.oxox.work/web/php-basic/zendstudio/ 注明:还未验证
- stm32DMA通道 ADC通道
DMA: 1.使用DAC的时候.将转化后得到的模拟信号通过IO口输出的时候.为什么还将IO口配置能输入模式 PS:stm32手冊上定义PA4和PA5分别和DAC1通道和DAC2通道相连 : DMA1 ...