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

Source

  • 处理I/O读写请求,将请求块放入I/O请求队列
  • 启动RK磁盘(如果有必要的话)

5388

5389 rkstrategy(abp)

5390 struct buf *abp;

5391 {

5392     register struct buf *bp;

5393     register *qc, *ql;

5394     int d;

5395

5396     bp = abp;

5397     if(bp->b_flags&B_PHYS)

5398     mapalloc(bp);

  • 如果b_flags包含B_PHYS标志,调用mapalloc程序,该调用除了对pdp11/70系统外并无其他作用,故此处不予讨论
5399     d = bp->b_dev.d_minor-7;

5400     if(d <= 0)

5401     d = 1;

5402     if (bp->b_blkno >= NRKBLK*d) {

5403          bp->b_flags =| B_ERROR;

5404          iodone(bp);

5405          return;

  • 如果缓存块所指定的块号越界,则置B_ERROR标志
  • 本次I/O就此结束,直接返回
5406     }

5407     bp->av_forw = 0;

  • 由于bp将被插入设备I/O队列尾部,其后没有缓存块,故置av_forw为空
5408     spl5();
  • 中断等级变为5级
5409     if (rktab.d_actf==0)

5410          rktab.d_actf = bp;

5411     else

5412          rktab.d_actl->av_forw = bp;

5413     rktab.d_actl = bp;

5414     if (rktab.d_active==0)

5415          rkstart();

5416     spl0();
  • 开中断
5417 }

5418 /* -------------------------*/

Ref

Caller

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