启动时的 Android insmod 内核对象

Posted

技术标签:

【中文标题】启动时的 Android insmod 内核对象【英文标题】:Android insmod kernel object on boot 【发布时间】:2014-05-12 17:58:30 【问题描述】:

我目前正在尝试在引导过程结束时安装内核模块,因此我在 init.rc 中创建了以下条目:

on post_late_start
    start myscript

on nonencrypted
    class_start late_start
    trigger post_late_start

on property:void.decrypt=trigger_restart_framework
    class_start main
    class_start late_start
    trigger post_late_start

service myscript /data/my_sh.sh
    disabled
    oneshot

然后在我的 /data 目录中 my_sh.sh 有以下内容:

#!/system/bin/sh
    log -t mytag -p V "Hello World!"
    insmod mymodule.ko mod_parameter=arg

但是当我运行时——有时我在 logcat -s "mytag" 时看不到 "Hello World" 标签,当然也没有安装 insmodded 模块。

后期插入内核模块的正确方法是什么(它需要在网络启动并安装 /data 后进入)。更进一步——如何将 insmod 的输出输入日志以便调试?感谢您提供任何帮助,如有必要,我可以发布更多详细信息。

【问题讨论】:

【参考方案1】:

至少从 Froyo 开始并且仍在 Lollipop 中,android init 在 system/core/init/buildin.c 中实现了 insmod。它应该直接在init*.rc 文件中工作:

on boot
    insmod /system/lib/modules/your-module.ko.

但是,至少在 Lollipop 5.1 中,它不再有效,因为 SELinux 规则被强制执行。 init 没有所需的 sys_module 权限。因此底层的init_module 系统调用返回EPERM。这从未向任何地方报告。唯一的症状是insmod 命令现在总是无法加载模块。

我为此开了一个AOSP issue。据谷歌称,这按预期工作。如果你想在 SELinux 被强制执行时使用内核模块(他们强烈建议不要这样做),你必须自己将所需的 SELinux 权限添加到init

【讨论】:

【参考方案2】:

我不确定您的日志,但是对于 insmod,您需要提供模块的确切路径,因为我认为您不会将 mymodule.ko 与 init.rc 放在同一个地方。所以试着给出你的 ko 文件的完整路径。 通常它位于 /lib/modules/youdrivername.ko

所以先在这里检查一下。

【讨论】:

以上是关于启动时的 Android insmod 内核对象的主要内容,如果未能解决你的问题,请参考以下文章

Insmod模块加载过程分析

insmod/rmmod

内核模块未加载(但insmod返回0)

linux内核模块相关命令:lsmod,depmod,modprobe,modinfo,insmod,rmmod 使用说明

insmod内核模块时提示Failed to find the folder holding the modules怎么办?

如何在android自定义内核中构建Hello World