大家好~
我在移植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
谢谢~
解决方案 »
- linux 如何用regmap操作多个i2c从地址的设备
- 关于大硬盘分区求教
- linux 找不到eth0设备 启动eth0失败
- 华硕主板BIOS 从独立显卡改成集成显卡显示
- 在ARM上,Picogl库运行三维视图出错
- linux集群上gcc编译出错
- Linux下怎么产生一个虚拟网络?能进行tcp/udp通信,但ifconfig显示不出来!
- faster-rcnn出错:confidence = np.array([float could not convert stringto loat:
- (求助)ubuntu18.04.2 LTS 关机动画缺失,只有代码刷屏
- linux内存占用率高,找不到相应进程。
- 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 文件所需的预先加载的模块没有加载
个人意见,仅供参考