尝试从 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
目前我能够找到所写程序的寄存器值,但不能找到其他进程的寄存器值。
目前我写的是:
#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