固件包:它们实际上是做什么的?


8

在我的CentOS上,yum update出现了以下内容:

(6/38): iwl1000-firmware-39.31.5.1-62.el7_39.31.5.1-62.2.el7_5.noarch.drpm                                                                                                                                            
(7/38): iwl105-firmware-18.168.6.1-62.el7_18.168.6.1-62.2.el7_5.noarch.drpm                                                                             
(8/38): iwl135-firmware-18.168.6.1-62.el7_18.168.6.1-62.2.el7_5.noarch.drpm                                                                             
(9/38): iwl2000-firmware-18.168.6.1-62.el7_18.168.6.1-62.2.el7_5.noarch.drpm                                                                            
(10/38): iwl2030-firmware-18.168.6.1-62.el7_18.168.6.1-62.2.el7_5.noarch.drpm                                                                           
(11/38): iwl3160-firmware-22.0.7.0-62.el7_22.0.7.0-62.2.el7_5.noarch.drpm                                                                                                                                             

等等

这些就是所谓的“固件包”。例如,让我们找到其中一些已安装的:

rpm --query --all | grep firmware

然后查询其信息:

rpm --query --info iwl105-firmware-18.168.6.1-62.2.el7_5.noarch

我们得到:

Summary     : Firmware for Intel(R) Centrino Wireless-N 105 Series Adapters
Description :
This package contains the firmware required by the iwlagn driver
for Linux to support the iwl105 hardware.  Usage of the firmware
is subject to the terms and conditions contained inside the provided
LICENSE file. Please read it carefully.

好吧好吧。

我什至没有那种硬件,因为这是VM。

所以,问题:

固件包实际上是做什么的?

它们是否是“一次性安装”,并且运行一个不透明的可执行文件(立即在下一次启动时运行?),该可执行文件检查硬件是否存在,如果硬件存在,则将二进制代码泵入硬件的闪存中(也许在询问用户时;在Windows上,网址为至少,硬件闪烁总是充满了弹出的DOS窗口,必须单击的EULA和必须承受的进度条),然后将软件包标记为“已安装”。

他们是否修改了initramfs,以便内核模块加载二进制blob或在下次引导时发生某些情况?



Linux术语中什么是“固件”?,斯蒂芬·基特(Stephen Kitt)写道:因此,内核不使用固件文件,而是由内核固件文件加载到其他硬件上。这也使得在FLOSS系统中拥有不带源代码的软件几乎可以被接受:争论是它不是在主CPU上运行,而是在另一个设备上运行。窃笑,窃笑。
David Tonhofer

Answers:


4

可加载固件通常不是写到设备上闪存的“一次性安装”。固件已加载到设备上的易失性存储中,并且每次主机打开时都需要完成。加载固件之前,设备无法运行。可以将固件写入设备上的RAM,在这种情况下,固件包含设备上处理器的代码和数据,但也可以是定义现场可编程逻辑阵列(FPGA)的逻辑的位流,或某些两者的结合。

另一方面,闪存中的固件通常是在设备上预先编程的,并且只有在制造商对固件进行了更新的情况下才需要重写。通常,这是通过其他机制完成的,例如由用户运行的独立可执行文件。

制造商为何要使用RAM代替闪存的原因有很多。首先,可以设计一个单一版本的硬件,但同时提供该产品的多个版本(例如,针对不同的市场区域)。如果希望经常对产品进行现场升级,则通过这种方式进行固件升级可能比创建用于升级设备上闪存的程序的麻烦要容易得多。该程序应具有良好的用户界面,并应设计为尽可能对用户友好,因为它通常是由产品的最终用户运行的。某些具有闪存存储的设备通常无论如何都从RAM运行代码,并且它们只是在设备启动时将闪存的内容复制到RAM,


如果固件未从闪存加载到RAM中,设备打开后如何将固件加载到RAM中?
编码

如果设备无法自动加载固件,则主机可以使用设备与主机连接的总线将固件存储到设备的RAM中。典型的总线是PCI和USB。这样做是设备驱动程序的责任。上电后设备不能完全“死机”,它必须包含促进固件加载的逻辑。
约翰·迈伦(JohanMyréen),

我有点忘了我们在这里谈论外围设备,因此它将始终连接到总线。说得通!
编码

5

正如Anthony Geoghegan所 提到的Linux术语中的“固件”是什么?为什么有些司机仍然需要固件?提供有用的背景。

固件软件包是包含固件文件的软件包,包含旨在在系统中或与系统连接的设备上运行的代码的文件-常见的示例包括wifi芯片组。它们不是一次性安装程序,因此它们并不关心硬件是否可用。如果存在相关的硬件,相应的内核驱动程序将使用它们可用的文件:驱动程序将固件加载到目标硬件所连接的内存中,然后目标固件将运行以进行操作。

这些固件包与您正在考虑的固件安装程序无关,后者会将固件更新加载到闪存中(仅在需要更新时才需要执行此操作)。该过程确实是漫长的,通常是复杂的,并且似乎充满危险(至少,如果您基于制造商的警告提出印象)。Linux发行版中包含的固件包包含每次系统引导时都需要的固件,因为它已加载到易失性内存中。


2

除了已经很好的答案。

固件文件(又名专有二进制Blob)至少在设备冷启动时才加载到固件中。

该设备的设计目的是在RAM中获取固件,而不是使用ROM + RAM来降低生产成本。例如,您有一些以这种方式工作的Broadcom wifi芯片组和内部交换机芯片组。

解决了在VM中使用固件文件的问题。

在处理VM时,不需要固件文件。它们不会在任何地方加载;更少的以太网或wifi“固件”文件。

同样,考虑到在VM环境中不需要固件,这在Debian中具有很大的特质,它依赖于Linux内核中的通用固件文件包。


“在Debian中,这是对Linux内核中通用固件文件包的依赖,这是一个很大的特质” –至少内核软件包推荐的固件确实没有DFSG ;-)。(但是您说得对,两项建议— firmware-linux-freeirqbalance—在当今的大多数部署中都没有用。)
Stephen Kitt,

我总是跑剧本来卸载克鲁夫特一轮内核升级后
瑞˚F里贝罗

1
您还可以进行配置apt,使其默认情况下不安装建议...
Stephen Kitt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.