设备分为块设备和字符设备
ll_rw_blk.c是其他程序调用设备所用到的程序。
对硬盘和软盘设备上数据的读写是通过中断处理程序进行
内核每次读写的数据量是逻辑块(1024字节),而设备的存储是扇区(512字节)
当程序读取设备数据时,首先向缓冲区管理程序提出申请,程序的进程进入睡眠状态,
缓冲区管理程序首先在缓冲区中寻找以前是否已经读取过这块数据,如果缓冲区有,就直接将对应的
缓冲区的头指针返回给程序并且唤醒程序。如果缓冲区不存在所要求的数据块,则缓冲区管理程序会调用
低级块读写函数ll_rw_block(),向相应的块设备驱动程序发出读写操作请求。ll_rw_block()函数会创建一个请求项,
并把该项插入到请求队列中,插入请求项使用了电梯移动算法。
内核使用一张设备表blk_dev[]来进行管理,每种设备在设备表中占一项。
设备项结构
struct blk_dev_struct{
void (*request_fn)(void);//函数指针,用于操作相应设备的请求项
struct request *current_request;//请求项结构指针,指明本块设备正在处理的请求项
};
系统发出写命令(hd_out())后等待给予允许向控制器写数据的响应,即请求服务标志DRQ置位,一旦DRQ置位,
系统就可以向控制器缓冲区发送一个扇区的数据,控制器发数据写入驱动器后,还会产生中断请求信号,中断过程
中执行前面预设置的write_intr(),该函数会查询是否还有数据要写,系统再把一个扇区的数据传给控制器缓冲区中,
一直这样重复执行,直到把所有数据写入驱动器,该函数执行本次写盘的结束后的处理工作,唤醒请求项的相关进程,
唤醒等待请求项进程,释放请求项并从链表删除该请求项以及释放相关缓冲区,最后再调用请求项操作函数执行下一个请求项。