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

Source

9041

9042 mmwrite(dev)

9043 {

9044     register c, bn, on;

9045     int a, d;

9046

9047     if(dev.d_minor == 2) {

9048          c = u.u_count;

9049          u.u_count = 0;

9050          u.u_base =+ c;

9051          dpadd(u.u_offset, c);

9052          return;

9053     }

  • "无底洞"模式,只修改参数
9054     for(;;) {

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

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

  • bn ← 块号
  • on ← 块内偏移
9057          if ((c=cpass())<0 || u.u_error!=0)

9058           break;

9059          a = UISA->r[0];

9060          d = UISD->r[0];

9061          spl7();

9062          UISA->r[0] = bn;

9063          UISD->r[0] = 077406;

  • LIONS 源代码为 9059 &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;a = UISA[[skill:r|->r]][0] = bn;
9060 &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;d = UISD->r[0] = 077406; 9061 &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;spl7(); 9062 &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;UISA->r[0]; 9063 &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;UISD->r[0]; 疑为笔误
9064          if(dev.d_minor == 1)

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

9066                               + (bn & 0177);

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

9069          UISD->r[0] = d;

9070          spl0();

9071     }

9072 }

9073 /* ------------------------- */

9074

9075

9076

9077

9078

9079

9080

9081

9082

9083

9084

9085

9086

9087

9088

9089

9090

9091

9092

9093

9094

9095

9096

9097

9098

9099

Caller

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