在系统(内核)与硬盘进行IO 操作时,需要考虑三个对象之间的交互作用

它们是系统、控制器和驱动器(例如硬盘或软盘驱动器)。系统可以直接向控制器发送命令或等待控制器发出中断请求控制器在接收到命令后就会控制驱动器的操作,读/写数据或者进行其它操作。因此我们可以把这里控制器发出的中断信号看作是这三者之间的同步操作信号,所经历的操作步骤为:

首先系统指明控制器在执行命令结束而引发的中断过程中应该调用的C 函数然后向块设备控制器发送读、写、复位或其它操作命令

控制器完成了指定的命令,会发出中断请求信号,引发系统执行块设备的中断处理过程,并在其中调用指定的C 函数对读/写或其它命令进行命令结束后的处理工作

对于写盘操作,系统需要在发出了写命令后(使用hd_out())等待控制器给予允许向控制器写数据的响应,也即需要查询等待控制器状态寄存器的数据请求服务标志DRQ 置位。一旦DRQ 置位,系统就可以向控制器缓冲区发送一个扇区的数据,使用port_write函数。当控制器把数据全部写入驱动器(或发生错误)以后将会产生中断请求信号

从而在中断处理过程中执行前面预设置的C 函数(write_intr())这个函数会查询是否还有数据要写。如果有,系统就再把一个扇区的数据传到控制器缓冲区中,然后再次等待控制器把数据写入驱动器后引发的中断,一直这样重复执行。如果此时所有数据都已经写入驱动器,则该C 函数就执行本次写盘结束后的处理工作:唤醒等待该请求项有关数据的相关进程、唤醒等待请求项的进程、释放当前请求项并从链表中删除该请求项以及释放锁定的相关缓冲区。最后再调用请求项操作函数去执行下一个读/写盘请求项(若还有的话)。

对于读盘操作,系统在向控制器发送出包括需要读的扇区开始位置、扇区数量等信息的命令后就等待控制器产生中断信号。当控制器按照读命令的要求,把指定的一扇区数据从驱动器传到了自己的缓冲区之后就会发出中断请求从而会执行到前面为读盘操作预设置的C 函数(read_intr())。该函数首先把控制器缓冲区中一个扇区的数据放到系统的缓冲区中,调整系统缓冲区中当前写入位置,然后递减需读的扇区数量。若还有数据要读(递减结果值不为0),则继续等待控制器发出下一个中断信号。若此时所有要求的扇区都已经读到系统缓冲区中,就执行与上面写盘操作一样的结束处理工作

results matching ""

    No results matching ""