![由设备识别的固件二进制文件](https://linux22.com/image/146844/%E7%94%B1%E8%AE%BE%E5%A4%87%E8%AF%86%E5%88%AB%E7%9A%84%E5%9B%BA%E4%BB%B6%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6.png)
固件二进制文件如何被任何设备识别,就像二进制文件是针对该设备的一样。内核在其中的作用是什么?
答案1
硬件设备不会指定固件文件的名称;设备驱动程序就是这样做的。
一般来说,内核可以根据标准化标识符(例如 PCI/PCIe 或 USB 总线上的供应商/产品 ID,或 DMI 信息)检测硬件,或者它可能已经知道该设备应该存在(平台设备;基于某些架构(例如 ARM 上的设备树信息),或者管理员或系统启动脚本可能会明确告诉内核加载某个驱动程序(仍然与一些基于旧 ISA 架构的 x86 旧设备一起使用,该架构不是全自动的) -可检测)。
然后,驱动程序将尝试使用硬件供应商记录的或逆向工程的某种方法来确认设备存在并确定设备的状态。如果设备需要固件,驱动程序将包含必要的内核调用来加载适当的固件文件。一旦固件数据加载到内存中,驱动程序就会使用适合该特定硬件的任何方法将其发送到硬件设备。
硬件设备本身可能会也可能不会验证固件数据是否正确。最简单的硬件设计可能只是相信驱动程序提供的固件是正确的,如果不正确,则可能会挂起,可能需要设备特定的重置序列,甚至需要断电/拔掉插头才能使设备再次可用。在另一个极端,固件可能经过加密签名甚至加密,并使用适当的密钥和功能来验证/解密嵌入在设备硬件中的固件。
在硬件本身中添加固件验证/解密逻辑会增加硬件设备的价格和复杂性,因此通常只有当使用非标准固件可能导致比设备本身无法工作更严重的问题时,制造商才会这样做:例如,WiFi 设备固件可以调节所使用的频率和功率级别,因此不正确的固件可能会导致设备在禁止的频率上进行传输,从而可能对空中交通管制雷达(民用或军用)造成干扰。这可能会产生非常严重的后果,因此硬件制造商有动力确保只能使用经过认证符合适当法规的固件版本。