code:procxmt - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
- 跟踪 机制的 子进程跟踪处理函数
- ipc 是父进程设置的跟踪 请求结构
- 对 ipc.ip_req不同取值作出解释
- 1,2 : 用户 指令/数据空间,从指定地址ipc.ip-addr读入一个字,到ipc.ipc-data
- 3 : PPDA区,从指定地址ipc.ip-addr读入一个字,到ipc.ipc-data
- 4,5 : 用户 指令/数据空间,向指定地址ipc.ip-addr写入一个字ipc.ipc-data
- 6 : PPDA区,向指定地址ipc.ip-addr写入一个字ipc.ipc-data
- 7 : 设置子进程信号,ipc.ip-data 送入 p_sig
- 8 : 终止子进程
- 对于 pdp11/40 ,指令空间和数据空间不分开
- 返回值
- ipc.ip_req == 7时,返回1
- ipc.ip_req == 8时,没有返回值(也不需要返回值...)
- 其余情况,返回0
4198
4199 /*
4200 * Code that the child process
4201 * executes to implement the command
4202 * of the parent process in tracing.
4203 */
4204 procxmt()
4205 {
4206 register int i;
4207 register int *p;
4208
4209 if (ipc.ip_lock != u.u_procp->p_pid)
4210 return(0);
4211 i = ipc.ip_req;
- ipc 的参数 被错误地设置(并非针对子进程),则直接返回0
4212 ipc.ip_req = 0;
4214 switch (i) {
- 唤醒父进程
- 在此处唤醒的正确性值得讨论... 列入遗留问题
4215
4216 /* read user I */
4217 case 1:
4218 if (fuibyte(ipc.ip_addr) == -1)
4219 goto error;
4220 ipc.ip_data = fuiword(ipc.ip_addr);
4221 break;
4222
4223 /* read user D */
4224 case 2:
4225 if (fubyte(ipc.ip_addr) == -1)
4226 goto error;
4227 ipc.ip_data = fuword(ipc.ip_addr);
4228 break;
4229
4230 /* read u */
4231 case 3:
4232 i = ipc.ip_addr;
4233 if (i<0 || i >= (USIZE<<6))
4234 goto error;
4235 ipc.ip_data = u.inta[i>>1];
- 地址 不在 PPDA区,进入错误处理
4236 break;
- i>>1 将单位从 字节 转化为 字
4237
4238 /* write user I (for now, always an error) */
4239 case 4:
4240 if (suiword(ipc.ip_addr, 0) < 0)
4241 goto error;
4242 suiword(ipc.ip_addr, ipc.ip_data);
4243 break;
4244
4245 /* write user D */
4246 case 5:
4247 if (suword(ipc.ip_addr, 0) < 0)
4248 goto error;
4249 suword(ipc.ip_addr, ipc.ip_data);
- 关于 为什么要用0作为参数 尝试写入,原因不明,列入遗留问题
4250 break;
4251
4252 /* write u */
4253 case 6:
4254 p = &u.inta[ipc.ip_addr>>1];
4255 if (p >= u.u_fsav && p < &u.u_fsav[25])
4256 goto ok;
4257 for (i=0; i<9; i++)
4258 if (p == &u.u_ar0[regloc[i]])
4259 goto ok;
4260 goto error;
4261 ok:
4262 if (p == &u.u_ar0[RPS]) {
4263 /* assure user space */
4264 ipc.ip_data =| 0170000;
4265 /* priority 0 */
4266 ipc.ip_data =& ~0340;
4267 }
4268 *p = ipc.ip_data;
- 若 想设置 堆栈中保存的PS,需要特殊操作
- 禁止 设置 先前态和当前态 为 核心态
- 禁止 提高 处理机优先级
- 当然,做法有些粗暴...
4269 break;
4270
4271 /* set signal and continue */
4272 case 7:
4273 u.u_procp->p_sig = ipc.ip_data;
4274 return(1);
4275
4276 /* force exit */
4277 case 8:
4278 exit();
4279
4280 default:
4281 error:
4282 ipc.ip_req = -1;
4283 }
4284 return(0);
4285 }
4286 /* ------------------------- */
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299