尝试从 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_structtask_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 上)。

另见: