linux0.11在读写块设备的时候,并不直接对块设备进行操作,而是借由低级的ll_rw_block函数通过请求项来与设备进行联系,也即加入了一个中间环节。当然,你也可以直接对块设备进行操作,但是直接操作会存在一些问题:
1. 同一个进程在写的过程中就不能发出读的请求,反之,在读的过程中也不能发出写的请求。
2. 当一个进程正在对硬盘进行写或者读的时候,其他进程就不能发出硬盘操作命令,只能进入睡眠状态,等待硬盘空闲,而不能做其他事情。
所以要解决上面的问题,最好的方法就是定义一个请求队列,将进程发出的各种请求放在队列中,至于什么时候硬盘开始读写就不用管了,进程就可以执行其它的操作。定义这个队列的另一个优点就是可以使用所谓的电梯算法,在频繁进行磁盘操作的时候可以非常有效的减少磁头移动的总距离,增加磁盘寿命。
linux0.11定义的请求项的数据结构如下:
struct request {
int dev; /* -1 if no request */
int cmd; /* READ or WRITE */
int errors;
unsigned long sector;
unsigned long nr_sectors;
char * buffer;
struct task_struct * waiting;
struct buffer_head * bh;
struct request * next;
};
struct request request[NR_REQUEST];
一共定义了32个请求,然后为每个块设备又再定义一个结构,用于指定设备的请求项操作函数do_xx_request。