Debian 内核 - 如果驱动程序是在内核中编译的,为什么我需要固件文件?

Debian 内核 - 如果驱动程序是在内核中编译的,为什么我需要固件文件?

我在用这个 USB wifi 设备在我的 Debian 上运行DE10-纳米板

从产品细节来看,它似乎使用了 RT2800USB 驱动程序中包含的 RT5370 芯片组。我已经在内核中启用了此功能,如下面的屏幕截图所示:

在此输入图像描述

但是,除非我也使用以下命令安装固件,否则 wifi 设备无法工作:

sudo apt install firmware-ralink

我的问题是 - 固件与驱动程序有什么关系? wifi设备不是应该已经有必要的固件了吗?这里究竟发生了什么?

我对内核驱动程序和设备很陌生,所以试图了解这里发生的魔力。我的理解是,要使用设备,我只需要确保相关驱动程序要么编译到内核中,要么作为稍后可以加载的模块提供。

这是我运行时的 dmesg 输出ifup wlan0。固件文件rt2870.bin由软件包提供firmware-ralink

[   78.302351] ieee80211 phy0: rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'
[   78.311413] ieee80211 phy0: rt2x00lib_request_firmware: Info - Firmware detected - version: 0.36
[   80.175252] wlan0: authenticate with 30:23:03:41:73:67
[   80.206023] wlan0: send auth to 30:23:03:41:73:67 (try 1/3)
[   80.220665] wlan0: authenticated
[   80.232966] wlan0: associate with 30:23:03:41:73:67 (try 1/3)
[   80.257518] wlan0: RX AssocResp from 30:23:03:41:73:67 (capab=0x411 status=0 aid=5)
[   80.270065] wlan0: associated
[   80.503705] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready

答案1

许多硬件设备制造商不会将固件嵌入到他们的设备中,他们要求操作系统的驱动程序将固件加载到设备中。

其他一些制造商嵌入了旧版本的固件,但允许驱动程序加载更新版本 - 通常嵌入的版本是古老的和/或有缺陷的(并且很少(如果有的话)在设备本身中进行更新,因为这可能需要更改制造或测试过程 - 这通常是一个经过深思熟虑的设计决定,其基本原理是嵌入式固件版本不必是。好的,它只需要类似于具有最低限度功能的东西 - 更新可以而且应该由驱动程序加载)

固件文件几乎总是具有与 GPL 不兼容的许可证(甚至没有明确或可识别的许可证,只是通过与设备本身及其附带的 Windows 驱动程序一起分发来隐含“使用权”),因此不能与内核本身一起分发,并且必须作为单独的包分发。

要使设备正常工作,您需要驱动程序和固件。

答案2

Linux 内核的固件是单独分发的,并且有自己的开发树。

https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree/

至于为什么要单独开发它们我不知道。一些可能的答案:

  • 对于其中一个,它可能有一个许可证,阻止它被包含在内。
  • 然后,您可以在不更新内核的情况下更新固件,并通过将它们分开保存来优化它。

是的,看起来确实是这样:https://lwn.net/Articles/284932/

对此写了一些很好的文章:https://www.linuxfromscratch.org/blfs/view/svn/postlfs/firmware.html

答案3

将固件包含在内核中是没有意义的,因为:

  • 启动内核不需要固件;只需要使设备充分发挥功能即可
  • 固件不会影响内核的功能(仅影响设备),并且在内核中包含所有固件只会使其变得更大
  • 在驱动程序加载时从文件系统上的文件(例如 /lib/firmware )加载固件比将其嵌入内核效果更好
  • 如果它没有嵌入到内核中,那么内核在将其加载到设备后无需执行任何特殊操作即可释放其内存
  • 在文件系统中拥有固件的单个副本比在每个安装的内核中包含固件的副本更好,尤其是当固件版本与内核版本无关时

而且,正如其他人指出的那样,将其包含在内核中可能无论如何都是不合法的。

有一些例外,大多数情况下设备的驱动程序和/或固件不是内核本身的一部分,但需要引导系统。在这些情况下,它们通常在内核或驱动程序安装期间构建时包含在 initrd 中。

相关内容