code:rkstrategy - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
- 处理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);
5399 d = bp->b_dev.d_minor-7;
- 如果b_flags包含B_PHYS标志,调用mapalloc程序,该调用除了对pdp11/70系统外并无其他作用,故此处不予讨论
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;
5406 }
- 如果缓存块所指定的块号越界,则置B_ERROR标志
- 本次I/O就此结束,直接返回
5407 bp->av_forw = 0;
5408 spl5();
- 由于bp将被插入设备I/O队列尾部,其后没有缓存块,故置av_forw为空
5409 if (rktab.d_actf==0)
- 中断等级变为5级
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();
- 如果RK磁盘尚未启动则启动之
5417 }
- 开中断
5418 /* -------------------------*/