固件块(来自linux-firmware)到底是什么?

根据https://wiki.gentoo.org/wiki/Linux_firmware
Linux固件是与Linux内核一起分发的软件包,其中包含对某些硬件设备的部分或全部功能所必需的固件二进制文件。这些二进制文件通常是专有的,因为一些硬件制造商不发布构建固件所需的源代码。
例如,我的蓝牙PCIe设备需要linux-firmware/qca/htbtfw20.tlv。这是一个内核驱动程序吗?为什么使用.tlv格式,而有些则是.bin?通常内核驱动程序是ELF可执行文件。
1个回答

许多硬件供应商对其硬件的工作原理保持秘密。这就是为什么他们将设备的某些功能隐藏在闭源的代码块中。他们通过驱动程序分发这些代码块。
这些代码块不由操作系统执行,而是加载到硬件中。在代码块被加载后,操作系统可以使用相应的驱动程序来管理设备。
在蓝牙设备的情况下,大多数设备都使用一个通用的Linux模块,例如btusb或者在您的情况下是hci_qca。该模块会检测设备并加载固件,然后就可以像其他设备一样使用它了。
文件被称为何种名称并不重要,这由供应商决定。
固件与驱动程序并不完全一样。它是由设备执行的一些代码,使设备能够与驱动程序进行通信。
Linux维护人员从供应商处获取固件或其驱动程序,并将这些代码块积累在linux-firmware git中。
发行版维护人员(如Canonical)将这些固件打包成软件包。在Ubuntu的情况下,出人意料的是linux-firmware软件包。它由内核linux-firmware git制成,并定期更新。

谢谢。但为什么固件不已经在设备中了呢? - Guerlando OCs
1我认为使用非易失性存储器更加昂贵,而且对于用户来说,刷新新的数据块会更加困难。因此,在启动时它会从操作系统中加载。 - Pilot6
只读存储器使设备变得比实际需要的更大和更昂贵。此外,通过操作系统加载固件使固件更新和修复变得更加容易(这也是为什么您可以通过软件包管理器进行更新的原因)。 - undefined