问题描述
目前我能够找到所编写程序的寄存器值,但不能为其他进程找到。
到目前为止我写的是:
#include <linux/sched.h>
struct task_struct *task_list;
for_each_process(task_list){
register int* pc asm("%pc");
register int mar asm("%mar");
register int mdr asm("%mdr");
register int cir asm("%cir");
register int acc asm("%acc");
register int ir asm("%ir");
register int eax asm("%eax");
register int ebx asm("%ebx");
register int ecx asm("%ecx");
register int edx asm("%edx");
register int ip asm("%ip");
register int esp asm("%esp");
register int ebp asm("%ebp");
register int esi asm("%esi");
register int edi asm("%edi");
register int of asm("%of");
register int df asm("%df");
register int _if asm("%if");
register int tf asm("%tf");
register int sf asm("%sf");
register int zf asm("%zf");
register int af asm("%af");
register int pf asm("%pf");
register int cf asm("%cf");
}
我意识到我需要使用 task_list 并指向结构 here 中的一个元素,但我似乎无法找到包含寄存器的元素。
解决方法
您可以使用宏 task_struct
从 task_pt_regs()
访问寄存器。它产生一个指向 struct pt_regs
(definition) 的指针,该指针是从进入内核时所有线程寄存器的保存副本。
例如:
struct task_struct *t = /* find the one you want */ ;
unsigned long tasks_eax = task_pt_regs(t)->ax;
请注意,尽管名称如此,ax
成员是完整的 32 位 eax
寄存器(在 x86-32 上)或 64 位 rax
寄存器(在 x86-64 上)。
另见: