访问内核模块中进程的预定指令
Access scheduled instructions of process in kernel module
我想编写一个内核模块来检查 运行 进程的预定指令。我已经看过 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
类型中?
感谢您的帮助。我在内核编程方面经验不足。
我猜这是您 的后续。您是正确的,通过 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
.
您现在有一个内存地址指向进程要执行的下一条指令。不过,这需要转换为物理地址才能供您使用。不过,这是另一个问题的主题。
一条简短的注释,用于回答您评论中的问题。指令不存储在某些数据结构中,例如链表。它们的所有操作数只是一个接一个地排列在一个序列中。你应该把它更像是一个可以被处理器解析的二进制文件。
我想编写一个内核模块来检查 运行 进程的预定指令。我已经看过 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
类型中?
感谢您的帮助。我在内核编程方面经验不足。
我猜这是您 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
.
您现在有一个内存地址指向进程要执行的下一条指令。不过,这需要转换为物理地址才能供您使用。不过,这是另一个问题的主题。
一条简短的注释,用于回答您评论中的问题。指令不存储在某些数据结构中,例如链表。它们的所有操作数只是一个接一个地排列在一个序列中。你应该把它更像是一个可以被处理器解析的二进制文件。