LinuxGod.net
Linux大神网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

如何在Ubuntu上为Android系统编写的Linux内核驱动程序?

2022年12月22日 96点热度

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

更新时间:2016年08月04日 11:25:08 作者:罗升阳

本文主要介绍在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序,这里对测试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文件来,以验证驱动程序的正确性。在这一篇文章里linux启动盘制作工具redhat linux 9.0,我们将通过自己编写的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文件:

#include 
#include 
#include 
#define DEVICE_NAME "/dev/hello"
int main(int argc, char** argv)
{
	int fd = -1;
	int val = 0;
	fd = open(DEVICE_NAME, O_RDWR);
	if(fd == -1) {
		printf("Failed to open device %s.n", DEVICE_NAME);
		return -1;
	}
	
	printf("Read original value:n");
	read(fd, &val, sizeof(val));
	printf("%d.nn", val);
	val = 5;
	printf("Write value %d to %s.nn", val, DEVICE_NAME);
 write(fd, &val, sizeof(val));
	
	printf("Read the value again:n");
 read(fd, &val, sizeof(val));
 printf("%d.nn", val);
	close(fd);
	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目录下android apk 动态加载linux驱动,看到可执行文件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 apk 动态加载linux驱动,我们将介绍如何在Android的Application Frameworks中,增加Java接口来访问Linux内核驱动程序,敬请期待。

后续继续对这部分的资料整理,谢谢大家支持本站!

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: dev linux系统 system
最后更新:2022年12月22日

Linux大神网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

Linux大神网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
Linux系统用户系统上的三种类型的帐户的介绍 Linux下的开机启动设置方法是什么?脚本或服务 谷歌更新Linux内核构建的公共内核库:添加对kokoro作业的支持 linux下mysql中可以使用REVOKE语句来删除某个用户的权限 内核的角度来看,调用hotplug和通常的hotplug环境 Linux系统在开机的时候自动加载某些脚本或系统服务 如何在Linux上安装Diablo3操作系统Diablo3 RedHatLinux软件安装包软件后缀为.rpm最初 1.1.4Linux的内核版本和发行版本是什么意思?(图) Linux系统的安装-Ubuntu开启虚拟机安装过程默认注意事项 hello_exit函数代码存放在__init段中(一) 英伟达将LinuxGPU内核模块作为开放源码/MIT双重许可证(图) virtualboxlinux官方版免费、小巧,同时支持Windows、Linux和Mac系统主机 Linux平台下的嵌入式软件要具备说明技能吗? 图解linuxlinux内核结构框图对内核框图有个总体的把握 linux虚拟机的安装步骤是什么?虚拟机和服务器的区别 精通Linux程序设计的高级程序员并非一件可望不可及的事情 linux虚拟机软件 Linux在安装的时候要注意什么?Linux安装注意事项 Python都有哪些应用,学习完成Python后能的工作方向 微软考虑用Rust开发内核的Linux内核-Hartman
Linux5.12的推送请求不断涌入新开放的合并窗口预计4月底看到它的稳定版本go语言被称作互联网时代的c语言,用来开发嵌入式linux的理由腾讯云服务器上也搭建一套环境,安装成功自动启动个人笔记本安装Ubuntu20.04LTS下载地址启动第一步--加载BIOS当你打开计算机电源(组图)虚拟机安装Ubuntu操作系统-Ubuntu空间20G镜像下载指令中各个make-C~/linuxM=`pwd编译Linux启动过程中的几个部分内核的引导(图)如何在Linux上安装虚拟机的结果大多都是怎么安装的一个免费软件时间跟进的小白鼠是什么鬼?专题计算机是如何启动的?、内核操作系统的启动流程学习Linux最简单、最实用的环境就是虚拟机环境(上)基于命令修改文件的权限命令-ld1.Linux磁盘分区和目录Linux发行版本之间的差别很少?国内性价比很高的Linux虚拟主机系统安装的流程是什么?Linux下修改文件权限的权限与所有权的实现就显得很有必要linux到底难不难学呢?推荐可以查看Linux命令大全Linux中修改文件权限的命令、创建者所在组、所有人Linux的内核放在了哪里?/boot的启动目录一览阿里云>社区>主题地图S>查看存储推荐
公司用一般不会给你最高权限的root账户管理功能 一个使用容器的最佳范例是使用Docker[1]_ 【每日一题】Linux内核源码/kernel/pid.c linux集群软件 Linux基础知识:一般而言分的三种情况及解决办法! linux多线程编程详解教程提供线程通过信号量实现通信代码 Linux线程的操作、多线程的同步和互斥的基本单位 Net编程自动调试监视工具(AutoFor.Net) 重新启动RedHatLinuxrelease命令注销系统的logout命令-上海怡健医学 Flutter的“野心”不止于跨平台开发,而是全平台制霸 iOS设备如何安装deb文件管理插件?越狱的方法 TP-LINK全能无线网卡驱动分享 打开电脑命令行快捷键进入电脑DOS命令界面方法:Command开始菜单 du下所有的文件和文件夹(不含子目录),统计符号链接所指向的大小 基于命令修改文件的权限命令-ld Linux基础入门(VMWare中CentOS7配置yum)目录之间的加载顺序 如何在Linux上安装Diablo3操作系统Diablo3 英伟达显卡驱动怎么安装?显卡怎么用? linux中添加ftp用户,并设置相应的权限,怎么上传目录? 1.使用标准Ubuntu仓库进行自动安装2.使用官方的NVIDIA驱动 1.Linux磁盘分区和目录Linux发行版本之间的差别很少?
标签聚合
软件 电脑 linux服务器 unix shell 虚拟机 linux系统 文件目录 sudo 命令模式
书籍
课程
技术群
技术干货大合集↓
  • 2023年2月 / 12篇
  • 2023年1月 / 161篇
  • 2022年12月 / 187篇
  • 2022年11月 / 76篇

COPYRIGHT © 2023 linuxgod.net ALL RIGHTS RESERVED.