【问题标题】:Trying to read register values of a process from task_struct尝试从 task_struct 读取进程的寄存器值
【发布时间】:2021-04-08 02:55:42
【问题描述】:

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

到目前为止我写的是:

#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 中的一个元素,但我似乎无法找到包含寄存器的元素。

【问题讨论】:

    标签: c assembly linux-kernel driver cpu-registers


    【解决方案1】:

    您可以使用宏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 上)。

    另见:

    【讨论】:

    • 如何访问程序计数器?我收到一个错误。
    • @roger: task_pt_regs(t)-&gt;ip? x86 上的程序计数器寄存器名为ip / eip / rip
    猜你喜欢
    • 2018-07-24
    • 2018-06-02
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多