当前正在执行的进程的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()
和其他也与您的任务有关。
@droid谢谢... context_switch是执行过程的pid更改的函数。这是我打算在下一个代码中使用task_struct的地方。有没有其他改变PID的其他入口?这种方法是否也适用于smp系统? –
我对内核并不熟悉,因此无法确定地回答其他入口点。至于SMP - 我认为一切都应该没问题。 –