EDN China > 设计实例 > 嵌入式系统 > 开发工具 > 正文
? 2016博客大赛-不限主题,寻找电子导师,大奖升级??

嵌入式Linux系统中MMC卡驱动管理技术研究

来源:单片机及嵌入式系统应用/作者:华中师范大学 官成钢 刘守印 程汉强 詹金晶?? 2007年07月10日 ?? 收藏0

  2.2 集群(clustering)读写和并发控制

  2.2.1 传统的块设备驱动程序结构和不足

  块没备驱动程序是Linux系统中最复杂的驱动程序之一,参阅文献[3,4]可以详细了解Linux块设备驱动程序。这里简单介绍与集群读写相关的数据结构和操作。扇区(seetor)是块设备硬件传输数据的基本单位,而块(block)是块设备请求1次I/O操作所涉及的一组相邻扇区,每个块都需要有自己的内存缓冲区。缓冲区首部(buffer_head)是与每个缓冲区相关的数据结构,每次对块没备的I/O传输都必须经过块的缓冲区。

  Linux块没备驱动程序采取一种延迟I/O策略。当进程有I/O请求时,驱动程序延迟一段时间,把块设备上相连续的buffer_head结构关联在一起形成一个I/O请求描述符(struct request),再把request结构按照电梯算法排队到设备的请求队列(request_queue_t)。这样实际执行I/O传输时,顺次处理对应块设备的请求队列。

  对于request结构的电梯排队算法,避免由于频繁的移动磁头而导致块设备性能下降;然而,目前在Linux块设备驱动程序中,对一个request结构中的

各个buffer_head结构分别发布I/O读写命令,会导致每次对一个buffer_head的输入/输出时,磁头都会停顿一段时间,进行DMA数据读写。这样频繁的磁头启停会导致磁盘性能下降。

  2.2.2 集群读写的实现

  传统的块设备驱动程序中每次发布读写命令都只对一个buffer_head缓冲而导致块设备性能下降。针对这一问题,我们对传统块设备进行改进,实现了集群读写。由于每一个request结构的buffer_head结构链对应的物理块都是相邻的,因此为进行集群读写创造了条件。request结构中的nr_sectors表示该request结构需要读写的块数。进行读写时,一次性发布读写块数为nr_seetors,读入块设备内容到requem结构指向的第一个buffer_head结构对应的内存区域。在一个buffer_head结构的缓冲区读写满了以后,就调整读写缓冲区地址为下一个buffer_head所指向的缓冲区,同时配合DMA进行数据传输,提高了读写速度。对一个request结构操作完成以后,释放request结构资源。实现集群读操作伪码如下:

  Read_mmc(){

  ??? 发布读写命令,读入的数据块数为一个rcquest一>nr_sectors的块数;

  ??? 缓冲区的指针指向第1个bh结构所指的缓冲区;

  ??? while(数据还没有读完){

  ??? 读入数据到buffer_head结构所指定的缓冲区;/*调用Pxa_read_mmc()*/

  ??? 调整缓冲区的指针到下一个buffer_head结构所指向的缓冲区;

  ??? }

  }

  2.2.3集群读写中的并发控制

  如果I/O请求队列request_queue_t是在内核中的许多地方都被访问的,则该队列就成为了临界资源。为了对该队列进行互斥保护,Linux2.4中所有的请求队列都受一个单独的全局自旋锁io_request_lock的保护。所有对清求队列的操作必须要求拥有该锁并禁止中断,然而,在驱动程序拥有这个锁的同时,其他任何读写请求不能排队到系统的任何块设备上,其他读写处理函数也不能运行。为了尽量减轻由于驱动程序长期的拥有该锁而导致系统性能下降的问题,在实现集群读写时必须遵循以下原则:

  ①对请求队列进行读写操作时要获得锁;

  ②对请求队列操作完毕后释放请求锁;

  ③为了减少占用锁的时间,可先把队列中的request结构从队列中取下来,再打开锁,然后在开锁的情况下对取下的request结构进行操作。

  基于以上原则,读/写处理函数的伪码如下所示:

  mmc_request_fn()

  ??? whilc(1){

  ??? 加锁io_request_lock;

  ??? 读取当前mmc卡请求队列的第一个请求结构request;

  ??? 释放锁io_request_lock;

  ??? if(request为空)

  ??? cxit(O); /*没有可以处理的队列,返回*/

  ??? read_mmc(); /*调用集群读写函数*/

  ??? 加锁io_request_lock;

  ??? 在queue结构中取处理完毕的request结构,释放request资源;

  ??? 释放锁io_request_lock;

  ??? }

  }


上一页123下一页
?? ?? ??


打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

1.扫描左侧二维码
2.点击右上角的分享按钮
3.选择分享给朋友
?? ??

MMC卡? 底层驱动? 集群读写?

上一篇: 基于VxWorks的FLASH存储器实时存取管理...
下一篇: ARM嵌入式平台的VGA接口设计
相关文章

我来评论
美国的游客
美国的游客 ??? (您将以游客身份发表,请登录 | 注册)
?
今日头条
精彩图集
有问题请反馈