데비안 커널 - 드라이버가 커널에서 컴파일된 경우 펌웨어 파일이 필요한 이유는 무엇입니까?

데비안 커널 - 드라이버가 커널에서 컴파일된 경우 펌웨어 파일이 필요한 이유는 무엇입니까?

나는 사용하고있다이 USB Wi-Fi 장치내 데비안에서 실행 중DE10-나노 플레이트.

제품 세부정보로 볼 때 RT2800USB 드라이버에 포함된 RT5370 칩셋을 사용하는 것으로 보입니다. 아래 스크린샷과 같이 커널에서 이 기능을 활성화했습니다.

여기에 이미지 설명을 입력하세요.

그러나 다음을 사용하여 펌웨어를 설치하지 않으면 Wi-Fi 장치가 작동하지 않습니다.

sudo apt install firmware-ralink

내 질문은 - 펌웨어가 드라이버와 어떤 관련이 있습니까? Wi-Fi 장치에 필요한 펌웨어가 이미 설치되어 있어야 하지 않나요? 여기서 무슨 일이 일어나고 있는 걸까요?

저는 커널 드라이버와 장치를 처음 접했기 때문에 여기서 일어나는 마법을 이해하려고 노력하고 있습니다. 제가 이해한 바로는 장치를 사용하려면 관련 드라이버가 커널에 컴파일되거나 나중에 로드될 수 있는 모듈로 제공되는지 확인하기만 하면 됩니다.

이것은 내가 실행할 때의 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에 포함됩니다.

관련 정보