【发布时间】:2018-12-24 11:08:40
【问题描述】:
我已经开发了一个内核模块来管理一个 nf4 标签作为一个字符设备。
我在内核之外开发了这个模块,并在开发阶段将其编译为可加载的内核模块(即 .ko)。
一旦驱动程序运行正常且足够稳定,我就使用补丁将其插入到 linux 内核源代码 (v4.9.30) 中,以便将其构建为内核的一部分。
我的情况是,模块在启动时被内核加载探测,因为它是内置的,并且出现在设备树中。
现在,我想尝试对驱动程序进行一些改进,我不想将这些更改直接实施到内核中。
所以我想将驱动程序的代码集成到 linux 内核中,但不让它在启动时插入。
为此,我刚刚将带有status = "disable"; 的驱动程序状态字段更改为设备树,并且确实在启动时不再插入该模块。
但是我无法插入已修改的可加载模块。我在插入时有一个ENODEV,这是由于在探测函数中找不到 platform_device。
我不明白的是为什么除了状态字段值之外没有更改设备树时找不到平台设备。
编辑:添加有关情况的精确度
经过更多探索后,我必须确定我什至没有输入回调 nf4_probe。
在将platform_driver_probe 实现(参见here)检查到v4.9.30 内核源代码后,似乎错误来自这里:
if (code == 0 && list_empty(&drv->driver.p->klist_devices.k_list))
retval = -ENODEV;
通过从命令行检查设备树,我可以看到设备被定义为目录/proc/device-tree/nf4tag 存在,并且填充了与设备树中的值对应的值。
编辑:在@sawdust 的回答之后添加关于问题目标的精确度
我显然误解了status=disable 的意思是该设备在硬件配置上根本不存在。虽然它只是描述是否应该探测驱动程序。
为了使我的目标更清晰,我确实将驱动程序编码为正确的模块并编译为我正在使用的内核的可加载模块。
但是我不想重新编译内核来测试我所做的每一个更改。所以我的目标是只重新编译 .ko 直到我进行了修改,然后,一旦一切都完成了,使用补丁将这些修改添加到内置模块中。
通过这种工作方式,我可以重建 .ko 并将其插入到我的目标平台上,而不是为每次修改重新编译内核。
所以要继续我的问题应该是:
如何在不重新编译内核的情况下将内置模块替换为可加载模块以禁用内置模块?
除了禁用内置模块编译到内核之外,也许没有解决方案。
【问题讨论】:
-
听起来您的驱动程序有两个版本:一个是可加载模块并在树外构建,另一个版本是内核源代码树中的内置模块?
-
是的,我有一个在开发过程中使用的树外驱动程序(编译为 .ko)。完成后,我已将此驱动程序修补到内核源代码中。现在我正在实现新功能,我想保留相同的内核,而不必删除已集成的驱动程序源。
标签: linux-kernel linux-device-driver kernel-module device-tree