我想编写一个内核模块来检查正在运行的进程的预定指令。我已经看过Linux Kernel Process Management,它解释了如何迭代进程。
struct task_struct *task;
for_each_process(task) {
/* this pointlessly prints the name and PID of each task */
printk("%s[%d]\n", task->comm, task->pid);
}
但是一旦我抓住task_struct
,我怎么能得到指示?我假设我需要先找到程序计数器,看看下一步将要执行哪些指令。
我需要检查task_struct
的哪个成员才能按照说明进行操作?它们存储在什么样的struct
类型中?
感谢您的帮助。我不熟悉内核编程。
答案 0 :(得分:2)
我猜这是你last question的后续内容。你是正确的,通过task_struct
你可以访问进程程序计数器(也称为x86上的指令指针)。我将回答x86,因为您表示您有兴趣查找特定于该指令集的指令。
您应该查看文件arch/x86/include/asm/processor.h
。它包含相当多的辅助宏和函数,因此您不必重新发明轮子。最有可能引起您兴趣的是task_pt_regs(task)
。该宏将为您提供与给定任务关联的所有寄存器值。这些值包含在struct pt_regs
中。您可以在arch/x86/include/asm/ptrace.h
中看到此结构的定义。您感兴趣的成员是unsigned long ip
。
现在有一个内存地址指向进程要执行的下一条指令。这将需要转换为物理地址,以便您可以使用。这是另一个问题的主题。
简要说明一下,回答评论中的问题。指令不存储在某些数据结构中,如链表。他们只是一个接一个地依次与他们所有的操作数。您应该将其视为可以由处理器解析的二进制文件。