一、概述
首先要说明的是内核每次读写的数据量以一个逻辑块为单位,即1024B,而块设备控制器则是以扇区(512B)为单位。
对硬盘的读写操作是通过中断处理程序进行的,使用读写请求项等待队列来顺序缓冲一次读写多个逻辑块的操作。进程读
硬盘上的一个逻辑块时向缓冲区管理程序提出申请,然后进入睡眠状态。缓冲区管理程序检查缓冲区以前是否已经读取过
这块数据,如有直接将对应的缓冲区块头指针返回给进程并唤醒它,否则,调用ll_rw_block()向相应的设备驱动程序发出
一个读数据块的操作请求。该函数创建一个请求结构项,插入队列,插入时采用电梯算法(至今还没读懂电梯算法)。如对应
设备的请求项队列空,则设备不忙,立即向该设备控制器发出读数据命令。当设备控制器将数据读入到指定的缓冲块中后,就
会发出中断请求信号,并调用相应的读命令后处理函数,处理继续读扇区操作或者结束本次请求项的过程。(引自赵炯老师)
二、数据结构
块设备项
struct blk_dev_struct {
void (*request_fn)(void);//请求项操作的函数指针
struct request * current_request;//当前请求项指针
};
块设备表
extern struct blk_dev_struct blk_dev[NR_BLK_DEV];//每种块设备都在表中占有一项,共7项
请求项
struct request {
int dev; /* -1 if no request */
int cmd; /* READ or WRITE