Linux kernel 内置驱动程序是否总是优先于可加载模块?

Linux kernel 内置驱动程序是否总是优先于可加载模块?,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,根据: 当多个内置模块(尤其是驱动程序)提供相同的 功能,它们按顺序指定的链接顺序排列优先级 在Makefile中列出 此外: 但是,此文件中的顺序是 不确定(取决于已安装文件的文件系统列表顺序) 模块)。这会引起混乱 解决方案分为两部分。此修补程序更新kbuild,使其 生成并安装modules.order,其中包含 根据Makefile订购的模块 如果一个系统有多个驱动程序提供相同的功能,其中一些是内置的,另一些是可加载的模块,会发生什么情况 在这种情况下,优先考虑哪一个?它总是内置的吗?我

根据:

当多个内置模块(尤其是驱动程序)提供相同的 功能,它们按顺序指定的链接顺序排列优先级 在Makefile中列出

此外:

但是,此文件中的顺序是 不确定(取决于已安装文件的文件系统列表顺序) 模块)。这会引起混乱

解决方案分为两部分。此修补程序更新kbuild,使其 生成并安装modules.order,其中包含 根据Makefile订购的模块

如果一个系统有多个驱动程序提供相同的功能,其中一些是内置的,另一些是可加载的模块,会发生什么情况

在这种情况下,优先考虑哪一个?它总是内置的吗?我如何更改优先级(如果可能的话)


我考虑过在modules.alias或modules.order中对它们进行重新排序,但我想这是行不通的,因为没有列出内置项-对吧?

我认为没有优先级。如果您有相同的驱动程序实例(一个来自内置,另一个来自内核模块),那么最终您将遇到编译错误或模块加载错误,因为存在重复的定义或其他错误

如果在同一硬件上有“不同”的驱动程序,不知道为什么要这样做

此外,如果有人已经探测并创建了设备,那么后面的人就不能做同样的事情,因为会有冲突

如果您只是简单地询问内置模块和LKM之间的“优先级”,那么肯定会首先询问内置模块。内核模块与内核位于不同的内存位置。因此,LKM的加载时间晚于内核


因此,如果您同时以两种不同的方式加载同一个驱动程序,LKM将因冲突而出现问题。

我同时找到了答案,并将其记录在此处:

长话短说: 是的,内置驱动程序通常优先于可加载驱动程序。
就因为它们是先注册的,而且绑定时遵循“先到先得”的原则。

我在这期间找到了一个答案,我将其记录在这里:原因很简单,因为4.20 hid microsoft确实声称Xbox Wireless Gamepad是我为其编写dkms驱动程序的。Udev也会加载hid microsoft和我的,这不是问题所在-问题是hid microsoft有时是内置的,因此通常会在hid总线上提前注册,因此无论发生什么情况,它都会获得设备。