首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

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

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

再次进入可打断睡眠状态;
被DMA传输完毕中断唤醒,发布结束传输命令,结束数据传输;

  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是在内核中的许多地方都被访问的,则该队列就成为了临界资源。为了对
返回列表