大家好~ 
我在移植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  
谢谢~

解决方案 »

  1.   

    啊这个帖子没人看到,还是没人知道解决方法啊?那我是不是要把这个帖子换到其他区,比如Linux应用或驱动区...... 
      

  2.   

    Android区里没人知道这个问题所以,Linux应用区有童鞋了解吗~~~~进程CAP
      

  3.   

    这个是WiFi的服务进程 [email protected]没有CAP_SYS_MODULE权限(对内核ko文件的加载与卸载权限)
    查看进程[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
      

  4.   

    曾经试过将 user改为root,但还是有问题。
    我记得是用户权限问题,毕竟AVC下,root不再是想干啥就能干啥的了最近,没有在研究这个问题了Orz 如果有什么进展,我会来说明的~
      

  5.   

    有没有试过 手动在串口   su 后,insmod 对应的.ko 文件试试?
    如果也是ng的,那就不是用户权限问题了那就可能是 .ko 文件所需的预先加载的模块没有加载
    个人意见,仅供参考