尝试从 task_struct 中读取进程的寄存器值

Trying to read register values of a process from task_struct

目前我能够找到所写程序的寄存器值,但不能找到其他进程的寄存器值。

目前我写的是:

#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_pt_regs()task_struct 访问寄存器。它产生一个指向 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 上).

另请参阅:

  • Where is eax in the pt_regs struct? Only ax is present