当前正在执行的进程的pid

问题描述:

朋友们,我试图跟踪包括运行在其上的进程在内的操作系统的完整执行情况。为此,我想让每个进程执行的指令及其执行跟踪,我想这样做,而不必去每个进程的objdump。当前正在执行的进程的pid

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

为了实现上述目标,我在模拟器Qemu上运行基于Linux的操作系统。

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

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

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

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

运行任务位于每个CPU runqueue中:请参阅struct rq定义kernel/sched.c

功能try_to_wake_up(),wake_up_process(),wake_up_new_task(),context_switch()和其他也与您的任务有关。

+0

@droid谢谢... context_switch是执行过程的pid更改的函数。这是我打算在下一个代码中使用task_struct的地方。有没有其他改变PID的其他入口?这种方法是否也适用于smp系统? –

+0

我对内核并不熟悉,因此无法确定地回答其他入口点。至于SMP - 我认为一切都应该没问题。 –