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

Source

只能写入特殊的位置,包括 u.u_fsavu.u_ar0
    • 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);

  • ipc 的参数 被错误地设置(并非针对子进程),则直接返回0
4211     i = ipc.ip_req;

4212     ipc.ip_req = 0;

4213     wakeup(&ipc);

  • 唤醒父进程
  • 在此处唤醒的正确性值得讨论... 列入遗留问题
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;

  • 地址 不在 PPDA区,进入错误处理
4235          ipc.ip_data = u.inta[i>>1];
  • i>>1 将单位从 字节 转化为 字
4236          break;

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;

  • 关于 为什么要用0作为参数 尝试写入,原因不明,列入遗留问题
4249          suword(ipc.ip_addr, ipc.ip_data);

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;

  • 只有PPDA区特殊位置 能被写入
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          }

  • 若 想设置 堆栈中保存的PS,需要特殊操作
    • 禁止 设置 先前态和当前态 为 核心态
    • 禁止 提高 处理机优先级
  • 当然,做法有些粗暴...
4268          *p = ipc.ip_data;

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

Ref

Caller

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