根据https://wiki.gentoo.org/wiki/Linux_firmware,
Linux 固件是与 Linux 内核一起分发的软件包,其中包含某些硬件设备的部分或全部功能所必需的固件二进制 blob。这些二进制 blob 通常是专有的,因为一些硬件制造商不会发布构建固件本身所需的源代码。
例如,我的蓝牙 pcie 设备需要linux-firmware/qca/htbtfw20.tlv
. 这是内核驱动程序吗?为什么是格式.tlv
,为什么有些是.bin
?通常内核驱动程序是 ELF 可执行文件。
许多硬件供应商对其硬件的工作方式保密。这就是为什么他们将设备的某些功能隐藏到封闭源代码中的原因。他们将 blob 与他们的驱动程序一起分发。
这些 blob 不由操作系统执行,而是加载到硬件中。加载 blob 后,操作系统可以使用某些驱动程序管理设备。
在蓝牙的情况下,一个通用的 Linux 模块,例如
btusb
,或者hci_qca
在你的情况下,用于大多数设备。该模块检测设备,加载固件,然后它可以使用该设备作为任何其他设备。如何调用文件并不重要。它由供应商选择。
固件不完全是驱动程序。它是由设备执行的一些代码,允许它与驱动程序通信。
Linux 维护人员从供应商或他们的驱动程序处获取固件,并在linux-firmware git中积累 blob 。
发行版维护者,如Сanonical,将这个固件打包成包。在 Ubuntu 的情况下,它是令人惊讶的
linux-firmware
软件包。它由内核 linux-frimware git 组成,并不时更新。