从内核的角度来看,请参阅/ usr / src / linux / Documentation / firmware_class / README:kernel(driver):调用request_firmware(&fw_entry,$ FIRMWARE,device)用户空间: - / sys / class / firmware / xxx / {loadinglinux内核版本号比较脚本,data}出现。 - 使用$ FIRMWARE中的固件标识符调用hotplug和通常的hotplug环境。 - hotplug:echo 1> / SYS /班/固件/ XXX /加载kernel:丢弃任何先前的部分加载。用户空间: - hotplug:cat proper_firmware_image> / SYS /班/固件/ XXX /数据kernel:以PAGE_SIZE为增量生成缓冲区以保存图像进来。用户空间: - hotplug:echo 0> / SYS /班/固件/ XXX /加载kernel:request_firmware()返回linux软件工程师培训,驱动程序有固件fw_entry-> {data,size}中的图像。如果出了什么问题request_firmware()返回非零并且fw_entry设置为空值。kernel(驱动程序):驱动程序代码调用release_firmware(fw_entry)释放固件映像和任何相关资源。内核实际上根本不加载任何固件。它只是通知用户空间,“我想要一个名为xxx的固件”,并等待用户空间将固件映像传送回内核。现在,在Ubuntu 8.04上,$ grep firmware /etc/udev/rules.d/80-program.rules#按需加载固件SUBSYSTEM ==“firmware”,ACTION ==“add”,RUN + =“firmware_helper”所以你发现,当内核要求固件时,
udev
被配置为运行
firmware_helper
。$ apt-get source udev阅读包裹清单......完成构建依赖树阅读国家信息......完成需要获得312kB的源档案。获取:1 hardy-security / main udev 117-8ubuntu0.2(dsc)[716B]获取:2 hardy-security / main udev 117-8ubuntu0.2(tar)[245kB]获取:3 hardy-security / main udev 117-8ubuntu0.2(diff)[65.7kB]获取312kB 1s(223kB / s)gpg:Signature made Tue 14 Apr 2009 Apr 31:31:34 PM EDT使用DSA密钥ID 17063E6Dgpg:无法检查签名:找不到公钥dpkg-source:在udev-117中提取udevdpkg-source:解包udev_117.orig.tar.gzdpkg-source:申请./udev_117-8ubuntu0.2.diff.gz$ cd udev-117 /$ cat debian / patches / 80-extras-firmware.patch如果您阅读了源代码,您会发现Ubuntu写了一个
firmware_helper
linux内核版本号比较脚本硬盘安装linux,它是硬编码的,首先查找
/lib/modules/$(uname -r)/$FIRMWARE
,然后是
/lib/modules/$FIRMWARE
,没有其他位置。把它翻译成
sh
,大概是这样的:
echo -n 1 > /sys/$DEVPATH/loading cat /lib/firmware/$(uname -r)/$FIRMWARE > /sys/$DEVPATH/data || cat /lib/firmware/$FIRMWARE > /sys/$DEVPATH/data if [ $? = 0 ]; then echo -n 1 > /sys/$DEVPATH/loading echo -n -1 > /sys/$DEVPATH/loading fi
这正是内核期望的格式。简而言之:Ubuntu的
udev
软件包具有始终首先在
/lib/firmware/$(uname -r)
中查找的自定义。此策略正在用户空间中处理。