Firmware 加载原理分析【转】

转自:http://blog.csdn.net/dxdxsmy/article/details/8669840

 

[-]

  1. 原理分析
  2. 实现机制
  3. 总结

 

前言      

              前段时间移植 wifi 驱动到 Android 的内核上,发现 firmware 的加载始终出错,问了几个人,都不是很了解,没办法,只好自己研究一下。

原理分析

    从本质上来说, firmware 需要做的事情包括两件:

1,  通知用户态程序,我需要下载 firmware 了;

2,  用户态程序把用户态的数据 copy 到内核层;

3,  内核把内核态的数据写到设备上,比如 wifi 模块里;

其中第三步应该不难,关键是看看, Linux 里面是如何实现第一、二步的;

实现机制

              简单的说,它的机制分成以下几部分:

1,  通过一定的方式,通知用户态程序,比如 init 程序,如图所示:

       

       显然是通过 kobject_uevent 的方式通知的应用层,它的机制我有空再详细解释,简单的说,就是往一个socket 广播一个消息,只需要在应用层打开 socket 监听 NETLINK_KOBJECT_UEVENT 组的消息,就可以收到了。

          用户态的 init 是如何做的?

       可以看到 init 程序打开了一个 socket ,然后绑定它,最后通过 select 来监听 socket 上来的数据,最后调用handle_device_fd 来处理收到的消息;当内核发送一个 KOBJ_ADD 的消息上来的时候,经过过滤,判断是否是 firmware 要被加载的消息,然后调用

              handle_firmware_event 来处理;

2,  用户态的数据如何下载到内核;

       本质上它是内核创建了两个文件,一个文件 A 用来标志下载的开始和结束,另外一个文件 B 用来接收用户层传下来的数据,当用户态的程序往 A 文件写入 1 的时候,标志用户态程序已经往里面写程序来,而往里面写入 0 的时候,就标志下载成功结束,如果写入 -1 就表示下载失败了;下面看看这两个文件是如何被创建的 , 以及数据是如何写到内核的,请看图:

                                                         

       这个图基本上就是两个文件被创立的过程,以及当这两个文件被用户态程序访问的时候将要被调用的函数,比如对于标志文件,如果往里面写入数据,将会触发函数 firmware_loading_store 函数,如果往 bin文件里面写入数据将会触发 bin 文件类型的 write 函数;

       用户态写数据的过程大约是这样的:当用户态收到 KOBJ_ADD 消息的时候最终将会调用handle_firmware_event 的函数;

      

      

 

       

                      它的过程就是:

a, 先往标志文件里面写 1 ;

b, 从用户空间读取数据;

c, 往内核创建的文件里面写数据;

d, 如果成功写入 0 ,否则写入 -1 ;

 

下面看看内核是如何接受这些文件的,前面提到内核创建了一个 bin 文件,用来接收用户态的数据,下面看看这个过程:

         对于SYSFS_KOBJ_BIN_ATTR 属性的文件,在 inode 初始化的时候,将会被赋予 bin_fops 的文件操作函数集,于是当上层调用 write 的时候,将会走到内核的 bin_fops.write 函数;这个函数干的事情很简单,就是把用户态的数据 copyright 到 bb->buffer ,而 bb->buffer 其实是在 open 的时候分配的空间,这样的话,就实现了用户态的数据到内核的 copy ;过程是不是完了?

还有一个步骤,这个 bb->buffer 本身是如何与 wifi 驱动交互的呢?这只是一个中间层,它的数据必须要写到 wifi 的驱动才应该算完整,而这一步其实就是通过 flush_write 来完成的,下面看看这个过程:

这里可以清楚的看到, flush_write 做的事情就是把 bb->buffer 的内容 copy 到 wifi driver 分配的空间 fw->data 里面去了,至此,用户态的数据已经完整的写到了 wifi 的 driver 空间了;

 

3,  内核态的数据到 wifi 模块

                                                         这个就比较简单了,通过函数 sdio_writesb 利用 sdio 总线把数据写到模块里面去了;

 

 

总结

                  Firmware 的加载主要是利用了 uevent 的通讯机制实现用户态和内核态的交互,另外还涉及了 sys 文件系统里的文件创建 , 我加载 wifi firmware 始终出错的原因是 android 的文件系统要求把 wifi 的 firmware helper放到 /etc/firmware 里面,而把真正的 firmware sd8686.bin 放到 /etc/firmware/mrvl 里面,估计是 marvel 修改后的结果,结论就是,这个设计还真行。

From : http://blog.csdn.NET/linweig/article/details/5640697

时间: 2024-10-12 17:34:36

Firmware 加载原理分析【转】的相关文章

Grunt-cli的执行过程以及Grunt加载原理

通过本篇你可以了解到: 1 grunt-cli的执行原理 2 nodeJS中模块的加载过程 Grunt-cli原理 grunt-cli其实也是Node模块,它可以帮助我们在控制台中直接运行grunt命令.因此当你使用grunt的时候,往往都是先安装grunt-cli,再安装grunt. 如果你使用的是npm install -g grunt-cli命令,那么安装地址如下: windows: C:\\Users\\neusoft\\AppData\\Roaming\\npm\\node_modul

jvm-JVM加载原理@求大神推荐

问题描述 JVM加载原理@求大神推荐 哪位大神可以推荐一下,我需要看一些什么资料可以了解一些jvm的加载原理!最近在学习java有没有什么好点的书呢 解决方案 jvm的话可以看看<深入理解Java虚拟机:JVM高级特性与最佳实践>,其他书就是<java编程思想>和<effective java>了.不过这些书都需要你有了java一定的编程经验后再看,初学的话还是看一些带"入门"词汇的就行了. 解决方案二: <java的编程思想>.<

解析苹果的官方例子LazyTableImages实现图片懒加载原理

解析苹果的官方例子LazyTableImages实现图片懒加载原理 首先在官网下载源码: https://developer.apple.com/library/ios/navigation/#section=Resource%20Types&topic=Sample%20Code 打开运行: 仔细观察你会发现,只有在滑动停止的时候才会加载图片,是在如下位置实现的: 以下是设计先进的地方: 下载图片是可以取消的: 总结: 实现起来很easy:)

WordPress实现HTML5预加载与加载原理

HTML5预加载原理 ,这里简单的写一下原理 同时也把原理放出,这个方法的关键在于link rel="xx"这里,rel属性在html5发生 了变化,所以可以使用它来实现预加载,这里贴出rel在html4.01和html5的值供参考. linkrel html5-rel HTML 4.01 与 HTML 5 之间的差异 已删除的值:appendix, chapter, contents, copyright, glossary, index, section, start, subse

Linux firmware 加载【转】

转自:http://blog.chinaunix.net/uid-22028680-id-3157922.html 1.request_firmware在内核使用,需要文件系统支持,就是说,启动的时候如果在驱动里面的probe函数调用 request_firmware ,那么系统将等待30s左右,因为文件系统还没有挂载,当然找不到固件了,所以最好在中断里面启动tasklet,然后request_firmware .如果不想等待,就用request_firmware_nowait,好像是这样写的.

(业务层)异步并行加载技术分析和设计

背景    前段时间在做应用的性能优化时,分析了下整体请求,profile看到90%的时间更多的是一些外部服务的I/O等待,cpu利用率其实不高,在10%以下. 单次请求的响应时间在50ms左右,所以tps也不会太高,测试环境压力测试过程,受限于环境因素撑死只能到200tps,20并发下.   I/O 目前一般的I/O的访问速度: L1 > L2 > memory -> disk or network   常见的IO:  nas上文件 (共享文件存储) output/xxx (磁盘文件)

javascript图片懒加载与预加载的分析

   预加载:提前加载图片,当用户需要查看时可直接从本地缓存中渲染.  两种技术的本质:两者的行为是相反的,一个是提前加载,一个是迟缓甚至不加载.懒加载对服务器前端有一定的缓解压力作用,预加载则会增加服务器前端压力.  懒加载的意义及实现方式有:    意义: 懒加载的主要目的是作为服务器前端的优化,减少请求数或延迟请求数.    实现方式:       1.第一种是纯粹的延迟加载,使用setTimeOut或setInterval进行加载延迟.     2.第二种是条件加载,符合某些条件,或触发

CodeIgniter配置之autoload.php自动加载用法分析_php实例

本文实例分析了CodeIgniter配置之autoload.php自动加载用法.分享给大家供大家参考,具体如下: CodeIgniter带了自动加载的功能,可以全局加载类库.模型.配置.语言包等,对于需要全局使用的功能相当方便. 例如:有个全局函数写在app_helper.php中,需要全局加载这个函数,只需设置autoload.php: 复制代码 代码如下: $autoload['helper'] = array('app'); 接下来,所有的地方都可以使用了,配置.模型等配置相似.但方便的同

jQuery常用的4种加载方式分析[原创]_jquery

本文实例分析了jQuery常用的4种加载方式.分享给大家供大家参考,具体如下: 1. 页面加载之前执行,与嵌入的js加载方式一样: (function($){})(jquery) 示例: (function($){ alert('Hello jb51'); })(jquery); 2. 页面加载后执行: $(document).ready(function(){}) 示例: $(document).ready(function(){ alert('Hello jb51'); }); 3. 页面加