code:mmwrite - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
- 内存映射文件 的 驱动函数(写)
- u.u_offset 用于 传入物理内存地址
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;
9057 if ((c=cpass())<0 || u.u_error!=0)
- bn ← 块号
- on ← 块内偏移
9058 break;
9059 a = UISA->r[0];
9060 d = UISD->r[0];
9061 spl7();
9062 UISA->r[0] = bn;
9063 UISD->r[0] = 077406;
9064 if(dev.d_minor == 1)9060 d = UISD->r[0] = 077406; 9061 spl7(); 9062 UISA->r[0]; 9063 UISD->r[0]; 疑为笔误
- LIONS 源代码为
9059 a = UISA[[skill:r|->r]][0] = bn;
9065 UISA->r[0] = (ka6-6)->r[(bn>>7)&07]
9066 + (bn & 0177);
9067 suibyte(on, c);
- 若 模式为 写入核心态内存,则将 UISA[0] 置核心态地址
9068 UISA->r[0] = a;
- 以 UISA0/UISD0 寻址,第0块第on个字节
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