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

Source

  • 跟踪系统 重要的函数
  • ptrace 的 系统调用函数
  • 共使用4个参数 request, pid, addr, data
    • request : 跟踪请求 类型,参看procxmt说明,保存在 u.u_arg[2]
    • pid : 子进程的进程号,保存在 u.u_arg[0]
    • addr : 跟踪的 地址参数,保存在 u.u_arg[1]
    • data : 跟踪的 数据参数,保存在 u.u_ar0[R0]
  • 一般情况下,子进程调用ptrace(0,0,0,0)
其他情况 由父进程调用ptrace

4160

4161 /*

4162  * sys-trace system call.

4163  */

4164 ptrace()

4165 {

4166     register struct proc *p;

4167

4168     if (u.u_arg[2] <= 0) {

4169          u.u_procp->p_flag =| STRC;

4170          return;

4171     }

4168 - 4171
  • 由子进程运行(参看跟踪)
  • 子进程 置 STRC (跟踪标志)
  • 以下由 父进程 运行
4172     for (p=proc; p < &proc[NPROC]; p++)

4173          if (p->p_stat==SSTOP

4174           && p->p_pid==u.u_arg[0]

4175           && p->p_ppid==u.u_procp->p_pid)

4176           goto found;

  • 查找 匹配的子进程
    • 状态 为 SSTOP
    • 进程号 为 pid
    • 当前进程 的 子进程
4177     u.u_error = ESRCH;
  • 找不到指定的子进程,则抛出错误
4178     return;

4179

4180     found:

4181     while (ipc.ip_lock)

4182          sleep(&ipc, IPCPRI);

4183     ipc.ip_lock = p->p_pid;

4184     ipc.ip_data = u.u_ar0[R0];

4185     ipc.ip_addr = u.u_arg[1] & ~01;

LIONS 源代码为[[code:ipc|ipc]].ip_addr - u.u_arg[1] & ~01; 疑为笔误

4186     ipc.ip_req = u.u_arg[2];

4183 - 4186
  • 填写 ipc 参数(跟踪请求参数)
4187     p->p_flag =& ~SWTED;

4188     setrun(p);

  • 子进程 清 SWTED 标志
  • 唤醒 子进程
4189     while (ipc.ip_req > 0)

4190          sleep(&ipc, IPCPRI);

4191     u.u_ar0[R0] = ipc.ip_data;
  • 返回值 置 跟踪请求处理后的数据
4192     if (ipc.ip_req < 0)

4193          u.u_error = EIO;

4194     ipc.ip_lock = 0;

4195     wakeup(&ipc);

  • 解锁 ipc
  • 唤醒 等待 ipc 的进程
4196 }

4197 /* ------------------------- */

Ref

Param

(ptrace = 26.; not in assembler)
(data in r0)
sys ptrace; pid; addr; request
(value in r0)
⚠️ **GitHub.com Fallback** ⚠️