Blk_drv:

Blk.h, Floppy.c, Hd.c, Ramdisk.c, Ll_rw_blk.c, Makefile; 头文件,软、硬、虚拟盘驱动程序、内核中其他程序访问块设备的接口程序。

总体:对软硬盘上的读写是通过中断处理程序进行的,每次读写数据量以一个逻辑块(1024字节)为单位,块设备控制器以扇区(512字节)为单位。处理过程中使用了读写请求项等待队列顺序缓冲一次读写多个逻辑块的操作。

当程序需要读取硬盘上的一个逻辑块时,就会向缓冲区管理程序提出申请,而程序的进程则进入睡眠等待状态。缓冲区管理程序首先在缓冲区中寻找以前是否已经读取过这块数据。如果缓冲区中已经有了,就直接将对应的缓冲区块头指针返回给程序并唤醒该程序进程。若缓冲区中不存在所要求的数据块,则缓冲管理程序就会调用本章中的低级块读写函数ll_rw_block(),向相应的块设备驱动程序发出一个读数据块的操作请求。该函数就会为此创建一个请求结构项,并插入请求队列中。为了提供读写磁盘的效率,减小磁头移动的距离,在插入请求项时使用了电梯移动算法

当对应的块设备的请求项队列空时,表明此刻该块设备不忙。于是内核就会立刻向该块设备的控制器发出读数据命令当块设备的控制器将数据读入到指定的缓冲块中后,就会发出中断请求信号,并调用相应的读命令后处理函数,处理继续读扇区操作或者结束本次请求项的过程例如对相应块设备进行关闭操作和设置该缓冲块数据已经更新标志,最后唤醒等待该块数据的进程。

即:

请求读取逻辑块-》缓冲区寻找-》无则向相应块设备发送读数据请求-》ll_rw_block为该请求创建请求结构项并插入该块的请求链表中-》块设备请求队列情况-》读数据命令,到缓冲区-》中断请求结束

每个块设备的当前请求指针与请求项数组中该设备的请求项链表共同构成了该设备的请求队列

看图:

图中示出了硬盘设备当前具有4 个请求项,软盘设备具有1 个请求项,而虚拟盘设备目前暂时没有读写请求项

具体:对于一个当前空闲的块设备,当ll_rw_block()函数为其建立第一个请求项时,会让该设备的当前请求项指针current_request 直接指向刚建立的请求项,并且立刻调用对应设备的请求项操作函数开始执行块设备读写操作。当一个块设备已经有几个请求项组成的链表存在,ll_rw_block()就会利用电梯算法,根据磁头移动距离最小原则,把新建的请求项插入到链表适当的位置处。

重点:

请求项采用数组加链表结构的主要原因是为了满足两个目的:一是利用请求项的数组结构在搜索空闲请求块时可以进行循环操作,因此程序可以编制得很简洁;二是为满足电梯算法插入请求项操作,因此也需要采用链表结构。

results matching ""

    No results matching ""