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

Source

9016 mmread(dev)

9017 {

9018     register c, bn, on;

9019     int a, d;

9020

9021     if(dev.d_minor == 2)

9022          return;

  • "无底洞" 模式,什么都读不出来...
9023     do {

9024          bn = lshift(u.u_offset, -6);

9025          on = u.u_offset[1] & 077;

  • bn ← 块号
  • on ← 块内偏移
9026          a = UISA->r[0];

9027          d = UISD->r[0];

9028          spl7();

9029          UISA->r[0] = bn;

9030          UISD->r[0] = 077406;

9031          if(dev.d_minor == 1)

9032           UISA->r[0] = (ka6-6)->r[(bn>>7)&07]

9033                              + (bn & 0177);

  • 若 模式为 读取核心态内存,则将 UISA[0] 置核心态地址
9034          c = fuibyte(on);
  • 以 UISA0/UISD0 寻址,第0块第on个字节
9035          UISA->r[0] = a;

9036          UISD->r[0] = d;

9037          spl0();

9038     } while(u.u_error==0 && passc(c)>=0);

9039 }

9040 /* ------------------------- */

Caller

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