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

Source

  • 将 缓存块管理结构 struct buf中的磁盘地址 转换为 RKDA寄存器 的地址形式
  • 共传入一个参数:bp
  • bp :缓存块管理结构,类型为struct buf

5419

5420 rkaddr(bp)

5421 struct buf *bp;

5422 {

5423     register struct buf *p;

5424     register int b;

5425     int d, m;

5426

5427     p = bp;

5428     b = p->b_blkno;

5429     m = p->b_dev.d_minor - 7;

5430     if(m <= 0)

5431          d = p->b_dev.d_minor;

5432     else {

5433          d = lrem(b, m);

5434          b = ldiv(b, m);

5435     }

  • 5429 - 5435 行,相当于m = p->b_dev.d_minor
  • 5429 5433-5434 涉及到Rk磁盘交叉存储,由于Unix V6后不再使用此机制,在此不作讨论
5436     return(d<<13 | (b/12)<<4 | b%12);
  • b为块号
  • d为从设备号
  • d<<13 将 从设备号置于 13-15位
  • b%12 为 扇区地址/块地址,置于0-3位
  • b/12 为 磁道地址(1磁道 = 12扇区/块),置于4-12位
    • b/12的末位为0,则在0面
    • b/12的末位为1,则在1面
    • 所以4位也指示面号
  • 参考 RKDA寄存器

5437 }

5438 /* ------------------------- */

Ref

Caller

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