我开发了一个内核模块来管理 nf4 标签作为字符设备。
我在内核之外开发了这个模块,并在开发阶段将其编译为可加载内核模块(即 .ko)进行了测试。
一旦驱动程序功能正常且足够稳定,我就使用补丁将其插入 Linux 内核源代码 (v4.9.30),以便将其构建为内核的一部分。
Here I'm in the situation where the module is loaded probed at boot by kernel as it's builtin and it appears into the device tree.
现在,我想尝试对驱动程序进行一些改进,但我不想将这些更改直接实现到内核中。
所以我想将驱动程序的代码集成到Linux内核中,但不要在启动时插入它。
为此,我刚刚更改了驱动程序的状态字段status = "disable";
到设备树中,实际上该模块在启动时不再插入。
但是我无法插入已修改的可加载模块。我有一个ENODEV
插入时,这是由于在探测函数中未找到 platform_device 造成的。
我不明白的是,当设备树除了状态字段值之外没有更改时,为什么找不到平台设备。
EDIT:添加有关情况的精确度
经过更多探索后,我必须明确我什至没有进入回调nf4_probe
.
检查后platform_driver_probe
实施(见here https://elixir.bootlin.com/linux/v4.9.30/source/drivers/base/platform.c#L660)进入 v4.9.30 内核源代码,错误似乎来自这里:
if (code == 0 && list_empty(&drv->driver.p->klist_devices.k_list))
retval = -ENODEV;
通过从命令行检查设备树,我可以看到该设备被定义为目录/proc/device-tree/nf4tag
存在并填充与设备树中的值相对应的值。
EDIT:在 @sawdust 的回答后添加关于问题目的的精确性
我显然误解了status=disable
意味着该设备根本不存在于硬件配置中。尽管它只是描述了是否应该对驾驶员进行调查。
为了使我的目标更清晰,我明确表示我确实将驱动程序编码为正确的模块,并将其编译为我正在使用的内核的可加载模块。
但是我不想重新编译内核来测试我所做的每一个更改。所以我的目标是仅重新编译 .ko 直到进行修改,然后,一旦完成所有操作,使用补丁将这些修改添加到内置模块中。
通过这种工作方式,我可以重建 .ko 并将其插入到我的目标平台上,而不是为每次修改重新编译内核。
所以继续我的问题应该是:
如何用可加载模块替换内置模块而不重新编译内核以禁用内置模块?
除了禁用内置模块编译到内核之外,也许没有解决方案可以实现此目的。