Android 8.0 HAL wifi加载问题

枫叶雪 2018-06-20 04:46:53
大家好~
我在移植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()的是"android.hardware.wifi@1.0-service",它对应的user是“wifi”,如何确认/添加CAP_SYS_MODULE呢?

请问,大家对这个问题有什么建议吗?啊~我研究了好几天,也没有解决掉这个init_module()的问题……Orz
谢谢~
...全文
2259 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
枫叶雪 2020-12-23
  • 打赏
  • 举报
回复 1
啊~~~ 我时隔两年多才回来看到了自己的贴子。 记得当时具体的问题解决方法是:WiFi芯片厂商重新release了HAL。。。也就是原本的HAL代码有问题。。。
mz454619501 2018-08-15
  • 打赏
  • 举报
回复
没有权限咯。。
scitachi 2018-08-15
  • 打赏
  • 举报
回复
有没有试过 手动在串口 su 后,insmod 对应的.ko 文件试试?
如果也是ng的,那就不是用户权限问题了。。。那就可能是 .ko 文件所需的预先加载的模块没有加载。。。
个人意见,仅供参考
枫叶雪 2018-08-02
  • 打赏
  • 举报
回复
曾经试过将 user改为root,但还是有问题。
我记得是用户权限问题,毕竟AVC下,root不再是想干啥就能干啥的了。。。

最近,没有在研究这个问题了。。。Orz 如果有什么进展,我会来说明的~
weixin_42772923 2018-07-23
  • 打赏
  • 举报
回复
这个是WiFi的服务进程 android.hardware.wifi@1.0-service没有CAP_SYS_MODULE权限(对内核ko文件的加载与卸载权限)
查看进程android.hardware.wifi@1.0-service是否具有CAP_SYS_MODULE权限
#ps -A
找到android.hardware.wifi@1.0-service,如下
root 3708 1 14364 9800 binder_thread_read 0 S android.hardware.wifi@1.0-service
进程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/android.hardware.wifi@1.0-service.rc <
service wifi_hal_legacy /vendor/bin/hw/android.hardware.wifi@1.0-service
class hal
user wifi----》修改位root
group wifi gps


枫叶雪 2018-07-04
  • 打赏
  • 举报
回复
Android区里没人知道这个问题。。。 所以,Linux应用区有童鞋了解吗~~~~进程CAP
枫叶雪 2018-07-02
  • 打赏
  • 举报
回复
啊。。。这个帖子没人看到,还是没人知道解决方法啊?那我是不是要把这个帖子换到其他区,比如Linux应用或驱动区......
枫叶雪 2018-06-21
  • 打赏
  • 举报
回复
我自己来顶一波~~~

23,118

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧