大家好~
我在移植wifi驱动到Android 8.0,目前遇到一个问题:加载驱动失败。具体错误是init_module()失败,错误码为-1(Operation not permitted);打印LOG发现传入的参数(ko文件路径、文件大小、insmod参数)并没有错。权限的话,我已经是root而且setenforce 0 了。 我是在命令行中root用户使用 # svc wifi enable 来打开WIFI的(因为LCD屏还不亮。。)
操作过程:
1. 切换到root
2. # setenforce 0
3. # svc wifi enable代码路径:frameworks/opt/net/wifi/libwifi_hal/wifi_hal_commom.cpp
然而,我使用 # insmod /vendor/lib/modules/wlan.ko是能够成功加载驱动的(root用户)。根据 Linux man page 关于init_module()的说明:
EPERM (就是-1 Operation not permitted)
The caller was not privileged (did not have the CAP_SYS_MODULE capability), or module loading is disabled (see /proc/sys/kernel/modules_disabled in proc(5)).
我这里module loading 没有disable,而这个CAP_SYS_MODULE是如何确认啊??
在logcat中看到调用init_module()的是"[email protected]",它对应的user是“wifi”,如何确认/添加CAP_SYS_MODULE呢?请问,大家对这个问题有什么建议吗?啊~我研究了好几天,也没有解决掉这个init_module()的问题……Orz
谢谢~
我在移植wifi驱动到Android 8.0,目前遇到一个问题:加载驱动失败。具体错误是init_module()失败,错误码为-1(Operation not permitted);打印LOG发现传入的参数(ko文件路径、文件大小、insmod参数)并没有错。权限的话,我已经是root而且setenforce 0 了。 我是在命令行中root用户使用 # svc wifi enable 来打开WIFI的(因为LCD屏还不亮。。)
操作过程:
1. 切换到root
2. # setenforce 0
3. # svc wifi enable代码路径:frameworks/opt/net/wifi/libwifi_hal/wifi_hal_commom.cpp
然而,我使用 # insmod /vendor/lib/modules/wlan.ko是能够成功加载驱动的(root用户)。根据 Linux man page 关于init_module()的说明:
EPERM (就是-1 Operation not permitted)
The caller was not privileged (did not have the CAP_SYS_MODULE capability), or module loading is disabled (see /proc/sys/kernel/modules_disabled in proc(5)).
我这里module loading 没有disable,而这个CAP_SYS_MODULE是如何确认啊??
在logcat中看到调用init_module()的是"[email protected]",它对应的user是“wifi”,如何确认/添加CAP_SYS_MODULE呢?请问,大家对这个问题有什么建议吗?啊~我研究了好几天,也没有解决掉这个init_module()的问题……Orz
谢谢~
解决方案 »
- [PRO*C] 在proc里用分析函数遇到的预处理问题,请指教
- 这个301为什么不能跳转,centos6 nginx环境
- Git push
- centos7 alien deb转rpm报错文件中没有条目data.tar.gz
- 怎么参加RHCSA认证考试
- 求Red Flag Asianux Server 4系统镜像或者rpm包
- openwrt执行脚本 提示 uci Entry not found 怎么办?
- 请求支援
- ubuntu16.04 e 无法定位软件包
- 请教一下,Ubuntu 18系统下文本编辑器没有背景,怎么解决?
- ROS最适合安装于哪个linux版本
- redhat 安装MySQL报错:error while loading shared libraries: libnuma.so.1 急求!Linux大神帮
查看进程[email protected]是否具有CAP_SYS_MODULE权限
#ps -A
找到[email protected],如下
root 3708 1 14364 9800 binder_thread_read 0 S [email protected]
进程pid是3708,执行如下命令:
c3005h:/ # cat proc/3708/status
(略)
CapInh: 0000000000000000
CapPrm: 0000003fffffffff
CapEff: 0000003fffffffff
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
(略)
https://blog.csdn.net/u010134087/article/details/58106428 中有介绍其中CapPrm中第16位代表当前进程是否有CAP_SYS_MODULE能力,1:有,0:无
进程调用init_module(),最终会调用内核/kernel/modules.c中:
SYSCALL_DEFINE3(init_module, void __user *, umod,
unsigned long, len, const char __user *, uargs)
此函数会调用may_init_module():
static int may_init_module(void)
{
if (!capable(CAP_SYS_MODULE) || modules_disabled)
return -EPERM; return 0;
}
capable(CAP_SYS_MODULE) :检测进程是否有加载卸载ko的权限解决方法:
将下面的服务的所有者修改为root即可
/vendor/etc/init/[email protected] <
service wifi_hal_legacy /vendor/bin/hw/[email protected]
class hal
user wifi----》修改位root
group wifi gps
我记得是用户权限问题,毕竟AVC下,root不再是想干啥就能干啥的了最近,没有在研究这个问题了Orz 如果有什么进展,我会来说明的~
如果也是ng的,那就不是用户权限问题了那就可能是 .ko 文件所需的预先加载的模块没有加载
个人意见,仅供参考