Linux 驱动程序是否支持内核级?

Linux 驱动程序是否支持内核级?

到目前为止,我认为 Linux 驱动程序是在内核级别。这意味着驱动程序被打包在内核中,因此只要运行相同版本的内核,不同的发行版就应该支持相同的硬件。当然,有些dkms驱动程序是在安装内核后安装的,但我不是在谈论这些。

今天我读了一篇文章并且它表示:“不同的发行版在其安装程序中打包了不同的驱动程序,这意味着,根据您使用的发行版,您会发现不同的硬件可能会或可能不会开箱即用。”

我遗漏了什么?不同的发行版如何打包不同的驱动程序?如果驱动程序打包在内核中,这怎么可能呢?

答案1

尽管 Linux 社区中驱动程序的可用性确实相当统一,但有几个因素导致总体情况不太完美。

您所指的驱动程序可用性的一致性当然适用于进入内核树的驱动程序。一旦确定了这一点,在不断发展的内核结构下对驱动程序开发的支持将完全由 Linux 内核组负责,您可以放心,从某个初始内核版本开始,这些驱动程序都是可用的。

但是,还有一大批专有驱动程序,出于显而易见的原因,它们可能无法进入内核树。或者有些驱动程序需要专有固件,这些固件不一定会自动安装,这取决于发行版开发人员对 FOSS(免费开源软件)原则的严格程度。对于这两种类型的驱动程序,其合法所有者的支持程度(更不用说它们的技术充分性)并不是随时间而恒定的,就像 Broadcom wifi 驱动程序的情况一样;因此需要开发 FOSS 替代品。除了 Broadcom 之外,一个著名的案例是 OpenSource NVidia 驱动程序。当没有开源替代品时,您可能会发现某些驱动器与旧内核版本兼容,但不与新版本兼容;在某些情况下,使用最新的 Linux 标头进行编译不是一种选择,因为它们可能引用不再存在的系统调用。

此外,新硬件通常会在不同的内核版本之间引入,现有驱动程序可能会(或多或少)适应这些硬件。例如,许多 wifi 适配器就是这种情况,制造商在某个时间点展示的是全新的,但它们是基于已有 Linux 驱动程序的现有芯片组。在某些情况下,简单的代码修改加上重新编译可以永久解决问题。其他时候,需要对驱动程序进行更复杂的修改,甚至引入全新的驱动程序。幸运的是,在这种情况下,Linux Backports 的慷慨人士为我们提供了与旧内核兼容的新版本或修改后的驱动程序。因此,即使您觉得自己落后了,也可以下载 backport来自这个网站将允许您使用最新的驱动程序。

换句话说,需要做一点工作(下载和编译 Linux 反向移植)来恢复您所指的近乎统一。

答案2

嗯,很多驱动程序都是可加载的内核模块- 虽然位于内核树中,但可能未编译。您始终可以稍后编译这些模块,安装并重新启动。通常,除非您从头开始编译,否则 gentoo 风格可能会在合理的默认设置之上使用这些模块。这允许内核添加模块而无需重新启动(使用 insmod),并且如果不需要则根本不加载模块。

DKMS 只是添加了一些可爱的功能,比如在内核更新时自动重新编译模块。

答案3

尝试下载内核源代码并运行make menuconfig。您将看到大量的选项,其中许多是内核模块,您可以将其编译进去(它们成为生成的内核映像的一部分),将其编译为模块(当内核已经启动时,它们可以从磁盘加载)或者根本不编译。

此外,发行版可能使用与官方(原始)内核版本不同的内核版本和不同的补丁集。某些发行版安装程序甚至允许您使用闭源驱动程序/固件,不能不能成为官方来源的一部分。

但总体而言,您可以使用大致相同的内核版本通过通用发行版获得大致相同的硬件支持。

相关内容