您的位置:首页 > 其它

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

2017-08-17 09:40 2541 查看
下个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条回复,点击查看





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

多谢大佬
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: