下个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 回复
    • 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 回复
    • 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条回复,点击查看

    举个例子,有伪代码夹杂:


    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 = &regs;
    iov.iov_len = sizeof(regs);
    ptrace(PTRACE_GETREGSET, pid, (void*)NT_PRSTATUS, &iov);

    // 使用_regs.eip等寄存器

    } else {

    x86_regs regs;
    iov.iov_base = &regs;

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

    // 使用_regs.rip等寄存器

    }

    }


    收起回复
    • 3楼
    • 2017-08-12 13:35
      Logo

      更多推荐