处理硬件设备访问权限问题

在硬件抽象层模块中,我们是调用open函数来打开对应的设备文件的。例如,在2.3.2小节中开发的硬件抽象层模块freg中,函数freg_device_open调用open函数来打开设备文件/dev/freg。

60 if((dev->fd = open(DEVICE_NAME, O_RDWR)) == -1) {
61       LOGE("Failed to open device file /dev/freg -- %s.", strerror(errno));
62       free(dev);
63       return -EFAULT;
64 }

如果不修改设备文件/def/freg的访问权限,那么应用程序调用freg_device_open函数打开设备文件/def/freg就会失败,从第61行的日志输出可以看到下面的内容:

Failed to open /dev/hello -- Permission denied.

这表示当前用户没有权限打开设备文件/dev/freg。在默认情况下,只有root用户才有权限访问系统的设备文件。由于一般的应用程序是没有root用户权限的,因此,这里就会提示没有权限打开设备文件/dev/freg。

解决这个问题的办法是,赋予root之外的其他用户访问设备文件/dev/freg的权限。我们知道,在Linux系统中,可以通过udev规则在系统启动时修改设备文件的访问权限3。然而,Android系统并没有实现udev机制,因此,我们就不可以通过定义udev规则来赋予root之外的其他用户访问设备文件/dev/freg的权限。不过,Android提供了另外的一个uevent机制,可以在系统启动时修改设备文件的访问权限。

在system/core/rootdir目录下有一个名为ueventd.rc的配置文件,我们可以在里面增加以下一行内容来修改设备文件/dev/freg的访问权限。

/dev/freg                 0666   root       root

这表示所有的用户均可以访问设备文件/dev/freg,即可以打开设备文件/dev/freg,以及读写它的内容。这样,除了root用户之外,系统中的其他用户也可以调用freg_device_open函数来打开设备文件/dev/freg。

修改了ueventd.rc文件后,需要重新编译Android源代码工程,这样新修改的设备文件/dev/freg的访问权限才能生效。这里,我们介绍一种不必重新编译Android源代码工程就可以使得修改后的设备文件/dev/freg的访问权限生效的方法。

在编译Android源代码工程时,文件system/core/rootdir/ueventd.rc会被拷贝到out/target/product/generic/root目录下,并且最终打包在ramdisk.img镜像文件中。当Android系统启动时,会把ramdisk.img镜像文件中的ueventd.rc文件安装在设备根目录中,并且由init进程来解析它的内容和修改相应的设备文件的访问权限。因此,只要我们能够修改ramdisk.img镜像文件中ueventd.rc文件的内容,就可以修改设备文件/dev/freg的访问权限。接下来就详细介绍修改ramdisk.img镜像文件中ueventd.rc文件的方法。

1. 解压ramdisk.img镜像文件

镜像文件ramdisk.img是一个gzip文件,因此,我们可以执行gunzip命令对它进行解压。

USER@MACHINE:~/Android$ mv ./out/target/product/generic/ramdisk.img ./ramdisk.img.gz

USER@MACHINE:~/Android$ gunzip ./ramdisk.img.gz

我们先将ramdisk.img改名为ramdisk.img.gz,然后调用gunzip命令对它进行解压。解压后得到的ramdisk.img文件保存在~/Android目录中。

2. 还原ramdisk.img镜像文件

解压后得到的ramdisk.img文件是一个cpio4格式的归档文件,因此,我们可以执行cpio命令对它解除归档。

USER@MACHINE:~/Android $ mkdir ramdisk
USER@MACHINE:~/Android $ cd ./ramdisk/
USER@MACHINE:~/Android /ramdisk$ cpio -i -F ../ramdisk.img

解除归档后得到的文件保存在~/Android/ramdisk目录中。

3. 修改ueventd.rc文件

进入到~/Android/ramdisk目录中,找到ueventd.rc文件,并且往里面增加以下一行内容:

/dev/freg                  0666   root       root

这一行内容赋予了系统中的所有用户访问设备文件/dev/freg的权限。

4. 重新打包ramdisk.img镜像文件

重新打包ramdisk.img镜像文件的过程其实就是第1步和第2步的逆过程,即先把ramdisk目录归档成cpio文件,然后压缩成gzip文件。

USER@MACHINE:~/Android/ramdisk$ rm -f ../ramdisk.img
USER@MACHINE:~/Android/ramdisk$ find . | cpio -o -H newc > ../ramdisk.img.unzip
USER@MACHINE:~/Android/ramdisk$ cd ..
USER@MACHINE:~/Android$ gzip -c ./ramdisk.img.unzip > ./ramdisk.img.gz
USER@MACHINE:~/Android$ rm -f ./ramdisk.img.unzip
USER@MACHINE:~/Android$ rm -R ./ramdisk
USER@MACHINE:~/Android$ mv ./ramdisk.img.gz ./out/target/product/generic/ramdisk.img

这样,重新打包后得到的ramdisk.img镜像文件中的ueventd.rc文件就修改好了,系统在启动之后就会通过init进程来赋予系统中的所有用户访问设备文件/dev/freg的权限。
_______________________________________
3 udev是Linux 2.6内核新增的一个功能,用来替代原来的devfs,是Linux系统默认的设备管理工具。udev 机制以守护进程的形式运行,通过侦听内核发出来的uevent来管理/dev目录下的设备文件,包括添加或者删除设备文件、修改设备文件的访问权限等。
4 cpio是一种包含其他文件和有关信息的归档文件,具体可以参考http://www.gnu.org/software/cpio/。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434859.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

根据rtk参数在arcgis中进行可视化

RTK原始文件 通过原始文件发现,arcgis中并没有中央经线是113的CGS2000投影坐标,所以此处需要进行自定义投影转换 不懂问题请进群交流

django图片上传到oss_django 配置阿里云OSS存储media文件的例子

1. 安装django-aliyun-oss2-storage包linux上用 pip install django-aliyun-oss2-storage 无报错,顺利安装windows上报错:(python3_sbs) F:\projects\virtualenv\python3_sbs\Scripts>pip install django-aliyun-oss2-storageCollecting django-aliyun-oss2-stor…

解决mapgis转位置范围偏差过大的问题(比例尺)

问题描述: 在mapgis投影坐标转地理坐标,结果发现地理坐标错误 这样的地理坐标很明显是错误的,发现经度位置些许有些偏差,纬度有大幅度偏差 问题主要出现在在调整投影参数的比例尺分母不正确 解决: 找一个相似研究范围的mapgis文件或者shp文件 方法1(mapgis文件): …

有意思的小学数学竞赛题-2

刚刚在matrix67上看到一篇很有意思的帖子,原文http://www.matrix67.com/blog/archives/4485 我老早就写过一个经典的小学几何题。如果你还没看过这个问题,你一定要去看看。一个小学奥数老师曾 经告诉我,当年带领学生参加这次竞赛时&#xff0…

c语言递归例题分数_C语言递归练习(附答案)

dic递归基础练习题:1.求123……n的值//a(a1)…bint sum(int a,int b){if(ba) return a;return asum(a1,b);}2.求1*2*3*……*n的值a*(a1)*(a2)…*bcheng(int begin,int end){if(beginend) return begin;return begin * cheng(begin1,end);}5.小猴子第一天摘下若干桃子…

MYSQL安装时解决要输入current root password的方法

在装MYSQL的时候发现要输入current root password (你的系统曾经装过MYSQL在重装就会要求输入原来设定的密码,如果是第一次安装就不会出现) 终归结出以下解决方法: 1.清除MYSQL的安装目录,默认是C:\Program Files 2.清除MYSQL数据存放目录&#xff0…

利用python处理中国地面气候资料日值数据集(V3.0)

原始文件 数据链接 00年到18年气象数据,但是未进行处理-数据集文档类资源-CSDN下载00年到18年气象数据,但是未进行处理,如果需要处理好的数据(execl和shp),请查看本博主其他更多下载资源、学习资料请访问C…

window.open使用中遇到的问题

前端开发中经常要用到 window.open 弹出一个新窗口来进行交互,但是在使用过程中却会碰到各种各样的问题,下面是我在平时开发过程中碰到的一些问题。 对于winodw.open的使用可以先看下这个文章 http://www.w3help.org/zh-cn/causes/BX1053 一.浏览器拦截…

VC的MySQL编程

一、在你的程序中使用数据库是不错的注意。如果已经有可用的MySQL服务器,在VC中可以按照如下方法实现与数据库的连接。 1、找来MySQL(Win32)安装目录下的include文件夹,将其添加到VC头文件目录列表中; (VC6 -> Options -> D…

python免费学校_清华大学,的python学习路线,免费分享给小白福利

python应该是近几年比较火的语言之一,很多人刚学python不知道该如何学习,尤其是没有编程基础想要从事程序员工作的小白,想必应该都会有此疑惑,包括我刚学python的时候也是通过从网上查找相关资料以及从学校课程学习才确定python学…

mapgis转shp左右位置偏差

问题描述 问题原因 一般情况下,投影中心经度不会出现这么复杂的数字,一般都是1110000,1170000,前3个数字为整数后四个数字为0 问题解决 主要思想:通常相差的经纬度,调整投影中心点经度 解决步骤 1.试图…

Oracle Database Appliance

转载:http://www.hellodb.net/2011/09/oracle-database-appliance.html自从Oracle收购了SUN,不仅仅得到了MySQL,Java,Solaris等,还得到了SUN的硬件产品,真正成为了一家软硬通杀的服务提供商。这几年&#x…

arcgis中的插值分析了解

1.前言 打开arcgis工具箱我们可以发现arcgis为我们提供了多种插值分析的工具,克里金插值、反距离权重插值、样条函数插值等,具体如图所示 在工具箱中除地形转栅格和通过文件实现地形转栅格是用来绘制dem数据,其他就是我们日常研究所用的插值工…

gcovr 安装_Kudu 1.8.0 编译安装配置

安装环境:CentOS6.8*3解决系统依赖:yum install autoconf automake cyrus-sasl-devel cyrus-sasl-gssapi cyrus-sasl-plain flex gcc gcc-c gdb git java-1.8.0-openjdk-devel krb5-server krb5-workstation libtool make openssl-devel patch pkgconfig…

关于Outlook删除原邮箱邮件的解决办法

最近需要用邮件多一些,就配置了一下Outlook客户端,配置的时候一般直接点下一步,自动配置就可以了,我也试过手动配置,解决老是出问题。别说,Outlook用起来还是相当方便的,不用每次都打开浏览器输…

解决MAPGIS导出数据乱码

所需软件: MAPGIS6.7 MAPGIS10版本以上 MAPGIS开发入门向导手册.zip-行业报告文档类资源-CSDN下载MAPGIS开发入门向导手册.zip更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/qq_39397927/85321238ArcGIS 问题描述 在mapgis中的…

r语言中的或怎么表示什么不同_s语言和r语言有什么区别

展开全部一、用法不同1、S语言:S语言用来进行数据探索、统计分析、作图的解释型语62616964757a686964616fe58685e5aeb931333431366261言。2、R语言:R是自由软件,是一种可编程的语言。二、开发人员不同1、S语言:语言是由AT&T贝…

AsyncTask的用法

在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。在单线程模型中始终要记住两条法则: 1. 不要阻塞UI线程 2. 确保只在UI线程中访问Android UI工具包 当一个程序第一次启动时&#x…

突破select的FD_SETSIZE限制

前言: 在很多比较各种网络模型的文章中,但凡提到select模型时,都会说select受限于轮询的套接字数量,这个 数量也就是系统头文件中定义的FD_SETSIZE值(例如64)。但事实上这个算不上真的限制。 C语言的偏方: 在C语…

袋装树和随机森林的区别

装袋法建树的时候是将所有预测变量都考虑进去, 而随机森林则是考虑每一个分裂点时,都是从所有的预测变量p中随机选取m个预测变量,分裂点所用的预测变量只能从这m个变量中选择。