96SEO 2026-02-19 22:35 0
href="https://www.cnblogs.com/ljbguanli/p/19621814"

aria-level="2">深入解析:[Linux]学习笔记系列
[base][drivers]firmware
xmlns="http://www.w3.org/2000/svg"> style="-webkit-tap-highlight-color: firmwared="M5,0
rgba(0,
categories:
tags:
09:01:49
https://github.com/wdfk-prog/linux-study
src="https://i-blog.csdnimg.cn/direct/b1d14562abd34931a71f7ab3978528fe.png">
class="toc">
Loader)框架。
这项技术的诞生是为了解决现代硬件驱动程序面临的几个核心问题:
根据GPLv2许可证,这些二进制“固件块”(blobs)不能直接编译进开源的Linux内核镜像中。
固件加载器提供了一种机制,将这些非开源固件与开源的驱动程序分离开来。
当固件需要更新以修复bug或添加新功能时,用户将不得不重新编译并安装整个内核。
固件加载器允许固件作为普通文件存放在文件系统中(通常在
/lib/firmware),使得更新固件就像替换一个文件一样简单,无需触及内核本身。
这样做会极大地增加内核的大小。
按需从文件系统中加载固件,意味着只有当检测到相应硬件并需固件时,才会将其读入内存,从而提高了内存采用效率。
id="_29">它的发展经历了哪些重要的里程碑或版本迭代?
固件加载机制经历了重要的演进:
/sbin/hotplug),并将所需固件的名称作为参数传递。
该脚本负责在文件系统中找到固件并将其提供给内核。
这种方式功能上可行,但执行一个新进程的开销较大,效率较低。
drivers/base/firmware代码的核心实现。它用一个更高效的、基于netlink套接字的uevent事件通知机制取代了执行脚本。
当内核需要固件时,它通过sysfs导出一个接口,并发送一个uevent通知用户空间守护进程(通常是systemd-udevd)。
该守护进程负责找到固件文件并将其内容写入内核通过sysfs创建的节点中,从而完成加载。
request_firmware()
API是同步的,会阻塞驱动的探测(probe)过程直到固件加载完成或超时。
后来,为了优化启动时间和处理不能睡眠的上下文,内核引入了异步的
request_firmware_nowait()
接口,它会立即返回,并在固件加载完成后通过回调函数通知驱动程序。
固件加载器是Linux内核中一个极其稳定、成熟且不可或缺的基础设施。
它被内核中几乎所有与复杂现代硬件交互的驱动程序所使用,包括但不限于:
Intel)
NVMe)
id="_44">核心原理与设计
固件加载器的核心是一个精心设计的内核与用户空间的交互流程,以
request_firmware()
API为例:
request_firmware(&fw,
来请求固件。
/sys/class/firmware/
my_firmware.bin),其中包含
loading等控制文件。
类型的uevent(内核事件)。
这个事件包含了所需固件的名称(FIRMWARE=“my_firmware.bin”)和请求该固件的设备信息。
request_firmware()
的内核线程现在会进入睡眠状态,等待用户空间提供固件数据。
systemd-udevdudevd守护进程接收到uevent。
它根据事件中的固件名称,在文件系统的标准路径(如
/lib/firmware/)下查找对应的固件文件。
udevd1文件,表示开始加载。
然后,它打开固件文件,读取其全部内容,并将这些二进制数据写入到sysfs的
data表示加载完成(或负值表示失败)。
data文件的写入操作会唤醒之前睡眠的内核线程。
固件加载器核心代码会验证接收到的数据,将其存入驱动提供的
struct指针所指向的结构中。
request_firmware()访问到固件内容,并将其上传到硬件设备。
release_firmware(fw)
id="_57">它的主要优势体现在哪些方面?
problem)
:这是该机制最核心的局限性。如果一个存储设备(如某些NVMe
SSD或RAID卡)的驱动需要加载固件才能初始化硬件,而这个固件文件又恰好存放在该存储设备上的根文件系统中,那么就会陷入死锁:驱动无法加载固件,因为文件系统不可用;文件系统不可用,因为驱动无法初始化。
在内核启动早期,将必要的驱动和固件资料打包到一个临时的、基于内存的文件系统(initramfs)中。
这样,驱动就可以在真正的根文件系统被挂载之前,从initramfs中加载到所需的固件。
id="_67">使用场景
请举例说明。
request_firmware
框架是Linux内核中需要从外部加载二进制数据块到驱动中的唯一标准且首选的解决方案。
iwlwifi)在探测到硬件后,会请求相应的iwlwifi-xxxx.ucode
固件。
这个固件包含了无线通信协议栈的底层实现,驱动会将其上传到网卡的处理器上执行。
amdgpu)在初始化时会加载多个固件文件,用于图形处理、视频编解码、电源管理等不同功能模块。SSD驱动
:一些企业级NVMe固态硬盘的驱动可能需要在启动时加载特定的固件来启用高级功能或应用安全补丁。id="_74">是否有不推荐使用该技巧的场景?
为什么?
进行详细对比。
固件的提供方式主要有以下几种,request_firmware
是其中最通用和灵活的一种。
align="left">固件加载器( | align="left">内核内置固件( | align="left">驱动自定义加载 | |
|---|---|---|---|
align="left">实现方式 | align="left">依据sysfs和uevent与用户空间交互,从文件系统(通常是initramfs或rootfs)加载固件。 | align="left">将固件文件直接编译链接进内核镜像( | align="left">驱动程序实现自己的逻辑,直接从某个固定地址(如Flash分区)读取固件。 |
align="left">灵活性/更新 | align="left">高。 更新固件只需替换文件并重启模块/体系,无需重新编译内核。 | align="left">低。 更新固件必须重新编译和部署整个内核。 | align="left">中等。 取决于自定义加载的构建方式,可能需要专门的工具来更新Flash分区。 |
align="left">启动依赖 | align="left">有。 依赖于文件系统(initramfs或rootfs)的可用性。 | align="left">无。 固件在内核加载时就已在内存中,许可用于最早期的设备初始化。 | align="left">可能无。 如果从独立的Flash分区读取,则不依赖于主存储。 |
align="left">许可合规性 | align="left">好。 清晰地将专有二进制固件与GPLv2的内核代码分离。 | align="left">差。 将非GPL兼容的固件直接链接进内核会引发许可证问题,通常不被允许。 | align="left">驱动自行负责,但通常用于内部编写的、许可一致的环境。 |
align="left">内核大小 | align="left">不影响内核镜像大小。 | align="left">增加内核镜像大小,可能非常显著。 | align="left">不影响内核镜像大小。 |
align="left">适用场景 | align="left">绝大多数通用Linux系统(桌面、服务器、Android)。 | align="left">需要固件才能访问根文件系统且无法使用initramfs的极少数情况;或者固件是完全开源且很小的情况。 | align="left">没有完整文件系统的深度嵌入式系统。 |
operator">*firmware_kobj
class="token
function">EXPORT_SYMBOL_GPL
class="token
punctuation">(
firmware_kobjclass="token
function">firmware_init
class="token
function">kobject_create_and_add
class="token
operator">!
firmware_kobjclass="token
punctuation">}
class="post-meta-container">
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback