当前正在执行的进程的pid

pra*_*kar 5 architecture linux scheduling linux-kernel

朋友们,我正在尝试跟踪操作系统的完整执行,包括在其上运行的进程.为此我想要每个进程执行的指令及其执行跟踪,我想这样做,而不必去做每个进程的objdump.

所以我的目标是:
1)建立每个pid的地址空间.
2)跟踪每个pid的执行情况.

为了实现上述目标,我在仿真器Qemu上运行基于Linux的操作系统.

当qemu第一次遇到指令时,我将使用guest虚拟机中的io-port或已知物理内存地址来检查运行此指令的进程的pid.然后我可以使用这些信息来做我想要的东西.

我的问题是......在kernel/sched.c中我可以知道接下来要执行的进程的pid.意味着我无法像 - > launch_process(pid)那样进行函数调用.有人请指点我在内核中的这个位置.或者系统中是否存在可以跟踪地址空间的已知位置.一个是CR3,但我真的不能相信它.

对于一些人来说,这似乎是指向这个位置的一个微不足道的指针,但我自己无法找到这个位置.

pra*_*oid 3

每个过程都有合适的struct task_struct。您可以使用函数通过 PIDfind_task_by_*()查找或获取给定任务的 PID。另请参阅“什么是 struct pid?” 中的部分。struct task_structtask_pid_*()include/linux/pid.h

正在运行的任务位于每个 CPU 的运行队列中:请参阅struct rq中的定义kernel/sched.c

函数try_to_wake_up()wake_up_process()wake_up_new_task()context_switch()其他函数也与您的任务相关。