在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序

简介:

在前一篇文章中,我们介绍了如何在Ubuntu上为Android系统编写Linux内核驱动程序。在这个名为hello的Linux内核驱动程序中,创建三个不同的文件节点来供用户空间访问,分别是传统的设备文件/dev/hello、proc系统文件/proc/hello和devfs系统属性文件/sys/class/hello/hello/val。进一步,还通过cat命令来直接访问/proc/hello和/sys/class/hello/hello/val文件来,以验证驱动程序的正确性。在这一篇文章里,我们将通过自己编写的C可执行程序来访问设备文件/dev/hello。可能读者会觉得奇怪,怎么能在Android系统中用C语言来编写应用程序呢?Android系统上的应用程序不都是Java应用程序吗?其实是可以的,读者不妨用adb shell命令连上Android模拟器,在/system/bin目录下可以看到很多C可执行程序,如cat命令。今天,我们就来学习一下怎么在Android系统中添加用C语言编写的可执行程序吧。

      一. 参照在Ubuntu上为Android系统编写Linux内核驱动程序一文,准备好Linux驱动程序。使用Android模拟器加载包含这个Linux驱动程序的内核文件,并且使用adb shell命令连接上模拟,验证在/dev目录中存在设备文件hello。

      二. 进入到Android源代码工程的external目录,创建hello目录:

      USER-NAME@MACHINE-NAME:~/Android$ cd external

      USER-NAME@MACHINE-NAME:~/Android/external$ mkdir hello

      三. 在hello目录中新建hello.c文件:

 

 
 
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <fcntl.h>  
  4. #define DEVICE_NAME "/dev/hello" 
  5. int main(int argc, char** argv)  
  6. {  
  7.     int fd = -1;  
  8.     int val = 0;  
  9.     fd = open(DEVICE_NAME, O_RDWR);  
  10.     if(fd == -1) {  
  11.         printf("Failed to open device %s.\n", DEVICE_NAME);  
  12.         return -1;  
  13.     }  
  14.       
  15.     printf("Read original value:\n");  
  16.     read(fd, &val, sizeof(val));  
  17.     printf("%d.\n\n", val);  
  18.     val = 5;  
  19.     printf("Write value %d to %s.\n\n", val, DEVICE_NAME);  
  20.         write(fd, &val, sizeof(val));  
  21.       
  22.     printf("Read the value again:\n");  
  23.         read(fd, &val, sizeof(val));  
  24.         printf("%d.\n\n", val);  
  25.     close(fd);  
  26.     return 0;  

这个程序的作用中,打开/dev/hello文件,然后先读出/dev/hello文件中的值,接着写入值5到/dev/hello中去,最后再次读出/dev/hello文件中的值,看看是否是我们刚才写入的值5。从/dev/hello文件读写的值实际上就是我们虚拟的硬件的寄存器val的值。

      四. 在hello目录中新建Android.mk文件:

      LOCAL_PATH := $(call my-dir)

      include $(CLEAR_VARS)

      LOCAL_MODULE_TAGS := optional

      LOCAL_MODULE := hello

      LOCAL_SRC_FILES := $(call all-subdir-c-files)

      include $(BUILD_EXECUTABLE)

      注意,BUILD_EXECUTABLE表示我们要编译的是可执行程序。 

      五. 参照如何单独编译Android源代码中的模块一文,使用mmm命令进行编译:

      USER-NAME@MACHINE-NAME:~/Android$ mmm ./external/hello

      编译成功后,就可以在out/target/product/gerneric/system/bin目录下,看到可执行文件hello了。

      六. 重新打包Android系统文件system.img:

      USER-NAME@MACHINE-NAME:~/Android$ make snod

      这样,重新打包后的system.img文件就包含刚才编译好的hello可执行文件了。

      七. 运行模拟器,使用/system/bin/hello可执行程序来访问Linux内核驱动程序:

      USER-NAME@MACHINE-NAME:~/Android$ emulator -kernel ./kernel/common/arch/arm/boot/zImage &

      USER-NAME@MACHINE-NAME:~/Android$ adb shell

      root@android:/ # cd system/bin

      root@android:/system/bin # ./hello

      Read the original value:

      0.

      Write value 5 to /dev/hello.

      Read the value again:

      5.

      看到这个结果,就说我们编写的C可执行程序可以访问我们编写的Linux内核驱动程序了。

      介绍完了如何使用C语言编写的可执行程序来访问我们的Linux内核驱动程序,读者可能会问,能不能在Android的Application Frameworks提供Java接口来访问Linux内核驱动程序呢?可以的,接下来的几篇文章中,我们将介绍如何在Android的Application Frameworks中,增加Java接口来访问Linux内核驱动程序,敬请期待。





本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/964500,如需转载请自行联系原作者

目录
相关文章
|
2月前
|
XML JSON Ubuntu
Linux系统之tree命令的基本使用
Linux系统之tree命令的基本使用
191 3
Linux系统之tree命令的基本使用
|
1月前
|
存储 Linux 内存技术
linux系统查看硬盘序列号
本文介绍在Linux系统中查看硬盘信息的三种方法:1) 使用`hdparm`工具,通过`sudo hdparm -i /dev/sda`获取硬盘序列号和型号;2) 使用`smartctl`工具,不仅可查序列号和型号,还能了解硬盘健康状态;3) 使用`lshw`命令显示存储设备拓扑信息。此外,提供通用技巧如用`lsblk`确认磁盘标识,及注意事项,例如管理员权限和云主机可能隐藏物理序列号等。
|
2月前
|
数据挖掘 Linux 数据库
服务器数据恢复—Linux系统服务器数据恢复案例
服务器数据恢复环境: linux操作系统服务器中有一组由4块SAS接口硬盘组建的raid5阵列。 服务器故障: 服务器工作过程中突然崩溃。管理员将服务器操作系统进行了重装。 用户方需要恢复服务器中的数据库、办公文档、代码文件等。
|
2月前
|
Ubuntu Linux 定位技术
在Ubuntu 20.04系统安装Matlab R2021a步骤
希望你可以充分享受这场旅行,从无知的迷雾中找到通向智慧的路。好好装备你的 Linux 旅行箱吧,因为还有很多其他的知识世界等待你去探索和征服。在知识的海洋里,只有勇敢的探索者才能找到自己的道路。快乐旅行!
161 23
|
2月前
|
Ubuntu 定位技术 开发工具
在Ubuntu 20.04系统中安装SLAM库的具体操作步骤
以上是在Ubuntu 20.04系统中安装SLAM库的具体操作步骤。就像积木游戏,需要按照正确的步骤,适时地添加正确的部件,才能够构建出我们想要的积木模型。在现实操作中可能会遇到各种问题,就像积木构建中的各种困难,我们要有耐心和决心去解决它们,最后得到我们想要的结果。希望这个有趣的积木游戏比方能帮助你更好地理解SLAM库的安装过程,并在实际操作中得到应用。
94 34
|
10月前
|
存储 Prometheus 监控
在Ubuntu系统上安装与配置Prometheus的步骤
通过以上步骤,您应该已经成功在Ubuntu系统上安装并配置了Prometheus。您现在可以开始使用Prometheus收集和分析您的系统和应用程序的指标数据了。
572 1
|
存储 Ubuntu Linux
Ubuntu 24.04 LTS系统安装Cockpit-Podman过程步骤
在 Ubuntu 24.04 上通过命令行使用容器可能有点困难,特别是对于初学者来说,因此,为了方便,我们可以在 Ubuntu 24.04 服务器上安装 Cockpit 和 Cockpit-podman 模块。接下来趣云笔记(www.ecscoupon.com)简单介绍Ubunt安装和配置Cockpit-Podman的步骤。
1279 0
|
Ubuntu Java Maven
百度搜索:蓝易云【Ubuntu系统安装Maven步骤】
以上就是在Ubuntu系统上安装Maven的简洁步骤。现在你可以使用Maven来管理和构建Java项目了。
103 1
|
2月前
|
Ubuntu 网络协议 应用服务中间件
在 Ubuntu 上安装 Nginx
在 Ubuntu 上安装和配置 Nginx 非常简单。首先更新系统包,然后通过 `apt` 安装 Nginx,检查服务状态并配置防火墙规则。访问服务器 IP 测试是否成功显示默认页面。还可管理服务、创建虚拟主机及排查常见问题,适合新手快速上手部署高性能 Web 服务。
252 0