求大佬解释下ptrace的pt_regs的定义,而且分为i386 arm x86和aarch64的不同分支

下个linux kernel,通常在arch/xxx/include下有ptrace.h(通常是,但不总是,找不到时不妨grep下),里面有相应结构的定义


收起回复
  • 2楼
  • 2017-08-12 11:41
  • 举报 |个人企业举报垃圾信息举报
  • futureIDE:  我有看过asm/ptrace.h linux/ptrace.h sys/ptrace.h的定义,但是只有i386和arm在asm/ptrace.h定义了pt_regs这个结构,x86和aarch64的没有
    2017-8-12 12:03 回复
  • futureIDE:  最主要的是,i386的pt_regs.eip或者arm的pt_regs.ARM_pc这种调用在aarch64下不能编译,我推测用了条件判断来定义了不同的pt_regs结构,但是我却找不到,只有i386和arm的
    2017-8-12 12:07 回复
  • futureIDE:  不好意思,说错了,是条件编译#if
    2017-8-12 12:10 回复
  • 求大佬解释下ptrace的pt_regs的定义,而且分为i386 arm x86和aarch64的不同分支_第1张图片
    a126285:  回复 futureIDE :arch下按构架作目录划分,需要的定义得到相应的构架目录下去找,x86_64在arch/x86/include/uapi/asm/ptrace.h,有x86和x86_64两个的定义;aarch64在arm64/include/uapi/asm/ptrace.h,叫user_pt_regs
    2017-8-12 12:52 回复
  • 求大佬解释下ptrace的pt_regs的定义,而且分为i386 arm x86和aarch64的不同分支_第2张图片
    a126285:  回复 futureIDE :那个uapi是user-space api的缩写,给应用用的相关定义。内核自己用的结构定义在例如说include/asm下,aarch64的arm64/include/asm/ptrace.h里也定义了pt_regs,前半部分结构就是user_pt_regs,后半有多余的内容,但不一定会通过ptrace返回(需要看实现确定),所以,用uapi里面的较好
    2017-8-12 12:55 回复
  • 我也说一句

    还有3条回复,点击查看

  • 求大佬解释下ptrace的pt_regs的定义,而且分为i386 arm x86和aarch64的不同分支_第3张图片
  • a126285
  • 小吧主
    12
举个例子,有伪代码夹杂:


struct x86_regs {
uint32_t ebx, ecx, edx, esi;
uint32_t edi, ebp, eax, xds;
uint32_t xes, xfs, xgs, orig_eax;
uint32_t eip, xcs, eflags, esp;
uint32_t xss;
};


struct amd64_regs {
uint64_t r15, r14, r13, r12;
uint64_t rbp, rbx, r11, r10;
uint64_t r9, r8, rax, rcx;
uint64_t rdx, rsi, rdi, orig_rax;
uint64_t rip, cs, eflags, rsp;
uint64_t ss, fs_base, gs_base, ds;
uint64_t es, fs, gs;
};


if (x86平台) {
if (进程是64位) {
amd64_regs regs;
iov.iov_base = ®s;
iov.iov_len = sizeof(regs);
ptrace(PTRACE_GETREGSET, pid, (void*)NT_PRSTATUS, &iov);

// 使用_regs.eip等寄存器

} else {

x86_regs regs;
iov.iov_base = ®s;

iov.iov_len = sizeof(regs);
ptrace(PTRACE_GETREGSET, pid, (void*)NT_PRSTATUS, &iov);

// 使用_regs.rip等寄存器

}

}


收起回复
  • 3楼
  • 2017-08-12 13:35
  • 举报 |个人企业举报垃圾信息举报
  • futureIDE:  多谢大佬

你可能感兴趣的:(求大佬解释下ptrace的pt_regs的定义,而且分为i386 arm x86和aarch64的不同分支)