首先系统指明控制器在执行命令结束而引发的中断过程中应该调用的C函数,然后向块设备控制器发送读,写,复位或其他操作命令。
当控制器完成了指定的命令,会发出中断请求信号,引发系统执行块设备的中断处理过程,并在其中调用指定的C函数对读写或其他命令进行命令结束后的处理工作。
对于写盘操作,系统需要在发出了写命令后(使用活动hd_out())等待控制器给予允许向控制器写数据的响应,即需要查询等待控制器状态寄存器的数据请求服务标志DRQ置位。一旦DRQ置位,系统就可以向控制器缓冲区发送一个扇区的数据,同样也使用hd_out()函数。
当控制器把数据全部写入驱动器(或发生错误)以后,还会产生中断请求信号,从而在中断处理过程中执行前面预设的C函数(write_intr())。这个函数会查询是否还有数据要写。如果有,系统就再把一个扇区的数据传输到控制器缓冲区中,然后再次等待控制器把数据写入驱动器后引发的中断,一直这样重复执行。如果此时所有数据都已经写入驱动器,则该C函数就执行本次写盘结束后的处理工作:唤醒等待该请求项有关数据的相关进程、唤醒等待请求项的进程、释放当前请求项并从链表中删除该请求项以及释放锁定的相关缓冲区。最后再调用请求项操作函数去执行下一个读写盘请求项(若还有的话)。
对于读盘操作,系统在向控制器发送出包括需要读写的扇区开始位置、扇区数量等信息的命令后,就等待控制器产生中断信号。当控制器按照读命令的要求,把指定的一扇区数据从驱动器传到了自己的缓冲区之后据会发出中断请求。从而会执行到前面为读盘操作预设的C函数(read_intr())。该函数首先把控制器缓冲区中一个扇区的数据放到系统的缓冲区中,调整系统缓冲区当前写入位置,然后递减读的扇区数量。若还有数据要读(递减结果值不为0),则继续等待控制器发出下一个中断信号。若此时所有要求的扇区都已经读到系统缓冲区中,就执行与上面写盘操作一样的结束处理工作。
对于虚拟盘设备,由于它的读写操作不牵涉到与外部设备之间的同步操作,因此没有上述的中断处理过程。当前请求项对虚拟设备的读写操作完全在do_rd_request()中实现。
在向硬盘或者软盘控制器发送了读写或其他命令后,发送命令函数并不会等待所发命令的执行过程,而是立刻返回调用它的程序中,并最终返回到调用块设备读写函数ll_rw_block()的其他程序中去等待块设备IO的完成。