code:rkintr - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Source

  • RK磁盘 I/O完成或发生错误时被调用
    • 进行错误处理
    • 处理已完成缓存块
    • 启动设备处理下一个在设备I/O队列的缓存块

5450

5451 rkintr()

5452 {

5453     register struct buf *bp;

5454

5455     if (rktab.d_active == 0)

5456          return;

  • 若设备未启动,则此次函数调用无意义,函数直接返回
  • 并不清楚什么时候会发生此情况,列入遗留问题
5457     bp = rktab.d_actf;

5458     rktab.d_active = 0;

  • 清设备启动标志(此时设备I/O已完成,可以清标志)
5459     if (RKADDR->rkcs < 0) { /* error bit */
  • RKCS最高位为错误位
  • RKCS<0,最高位为1,即错误位为1
  • 若 本次I/O出错,则执行以下操作
5460          deverror(bp, RKADDR->rker, RKADDR->rkds);
  • 在控制台显示错误消息
5461          RKADDR->rkcs = RESET|GO;
5462          while((RKADDR->rkcs&CTLRDY) == 0) ;
  • 等待RK磁盘,直到RK磁盘准备接受指令
5463          if (++rktab.d_errcnt <= 10) {

5464           rkstart();

5465           return;

5466          }

  • 若RK磁盘积累错误次数<=10,则
5467          bp->b_flags =| B_ERROR;
  • 若RK磁盘积累错误次数>10,则
    • 缓存块 置 错误标志
5468     }

5469     rktab.d_errcnt = 0;

5470     rktab.d_actf = bp->av_forw;

5471     iodone(bp);

  • RK磁盘积累错误次数 清零
  • 设备I/O队列 当前完成任务移除队列
  • 释放 已I/O完成的缓存块
5472     rkstart();
  • 启动RK磁盘,执行下一个任务
5473 }

5474 /* ------------------------- */

Ref

⚠️ **GitHub.com Fallback** ⚠️