对于各种块设备,内核使用了一张块设备表blk_dev[]来进行管理。每种块设备都在块设备表中占据一项。
块设备表中每个块设备项的数据结构为:
// 块设备处理结构。
struct blk_dev_struct {
void (*request_fn)(void); // 请求处理函数指针。
struct request * current_request; // 当前处理的请求结构。
}
// 下面是请求队列中项的结构。其中如果字段dev = -1,则表示队列中该项没有被使用。
// 字段cmd可取常量 READ(0)或 WRITE(1)(定义在include/linux/fs.h中)。
// 其中,内核并没有用到waiting指针,起而代之地内核使用了缓冲块的等待队列。因为
// 等待一个缓冲块与等待请求项完成是对等的。
struct request {
intdev; /* -1 if no request */ // 发请求的设备号。
intcmd; /* READ or WRITE */ // READ或WRITE命令。
int errors; //操作时产生的错误次数。
unsigned long sector; // 起始扇区。(1块=2扇区)
unsigned long nr_sectors; // 读/写扇区数。
char * buffer; // 数据缓冲区。
struct task_struct * waiting; // 任务等待请求完成操作的地方(队列)。
struct buffer_head * bh; // 缓冲区头指针(include/linux/fs.h,68)。
struct request * next; // 指向下一请求项。
};