我在Ubuntu下编译一个定制的内核,我遇到了我的内核似乎不知道在哪里寻找固件的问题。在Ubuntu 8.04下,固件与驱动程序模块的内核版本相同。例如,内核2.6.24-24泛型存储其在内核模块:Linux内核如何知道在哪里查找驱动程序固件?
/lib/modules/2.6.24-24-generic
及其在固件:
/lib/firmware/2.6.24-24-generic
当我编译根据2.6.24-24泛型Ubuntu的内核“Alternate Build Method: The Old-Fashioned Debian Way”我得到适当的模块目录和我的所有设备都可以工作,除了那些需要我的英特尔无线网卡(ipw2200模块)等固件的设备。
内核日志显示例如,当IPW2200尝试加载固件内核子系统控制固件的装载无法找到它:
ipw2200: Detected Intel PRO/Wireless 2200BG Network Connection
ipw2200: ipw2200-bss.fw request_firmware failed: Reason -2
错误号-base.h此定义为:
#define ENOENT 2 /* No such file or directory */
(返回ENOENT功能使负在它的前面。)
我试图创建在/ lib /固件符号链接在我的内核的名字指出到2.6.24-24通用目录,但是这导致了相同的错误。此固件是非GPL,由英特尔提供并由Ubuntu打包。我不相信它与特定的内核版本有任何实际的联系。 cmp
显示各个目录中的版本是相同的。
那么内核如何知道在哪里寻找固件?
更新
我发现this solution到我有确切的问题,但它不再工作作为Ubuntu已经消除/etc/hotplug.d
,不再存储其固件/usr/lib/hotplug/firmware
。
UPDATE2
一些更多的研究打开了一些答案。直到版本92的udev
,程序firmware_helper
是固件加载的方式。从udev
93开始,这个程序被替换为一个名为firmware.sh的脚本,据我所知可以提供相同的功能。这两个硬件将固件路径硬编码为/lib/firmware
。 Ubuntu似乎仍在使用/lib/udev/firmware_helper
二进制文件。
固件文件的名称被传递到firmware_helper
其中级联到路径/lib/firmware
和用于加载固件环境变量$FIRMWARE
。
request_firmware(..., "ipw2200-bss.fw", ...);
现在,在驱动程序调用request_firmware
和firmware_helper
介于看$FIRMWARE
环境变量:
实际的请求加载固件由驱动程序(IPW2200在我的情况),通过系统调用由,内核软件包名称会被预先固定到固件名称。
那么,谁在做呢?
有人可以添加一条评论,解释他们为什么要投票关闭这个问题吗?我会很感激反馈。 – 2009-06-04 13:44:20
由于它“属于serverfault.com”,因此被投票结束。由于这个问题不是关于编程,而更多是关于行政管理,这符合两个网站的使命陈述。 – ephemient 2009-06-04 22:21:59
感谢您的反馈。我曾考虑过这是一个编程问题,因为这是在尝试构建定制内核时遇到的问题。我想知道为什么具体的人会认为这不是编程相关的,但我认为我有一些很好的猜测原因。 – 2009-06-05 14:18:55