0

我想编写一个内核模块来检查正在运行的进程的预定指令。我已经看过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);
}

但是,一旦我掌握了 a task_struct,我如何才能获得说明?我假设我需要先找到程序计数器,看看接下来要执行哪些指令。

task_struct我需要检查哪个成员才能按照说明结束?它们以何种struct类型存储?

谢谢你的帮助。我对内核编程没有那么丰富的经验。

4

1 回答 1

2

我猜这是你上一个问题的后续。您是正确的,task_struct您可以通过 a 访问进程程序计数器(在 x86 上也称为指令指针)。我将回答 x86,因为您表示您有兴趣查找特定于该指令集的指令。

你应该看看文件arch/x86/include/asm/processor.h。它包含很多辅助宏和函数,因此您不必重新发明轮子。您最可能感兴趣的其中之一是task_pt_regs(task). 该宏将为您提供与给定任务相关的所有寄存器值。这些值包含在一个struct pt_regs. 您可以在 中查看此结构的定义arch/x86/include/asm/ptrace.h。您感兴趣的成员是unsigned long ip

您现在有了一个内存地址,该地址指向进程要执行的下一条指令。但是,这需要转换为物理地址才能对您可用。这是另一个问题的主题。

一个简短的说明,以回答您评论中的问题。指令不存储在像链表这样的数据结构中。它们只是一个接一个的序列,所有的操作数。你应该把它想象成一个可以被处理器解析的二进制文件。

于 2017-06-23T14:00:23.230 回答