朋友们,我正在尝试跟踪操作系统的完整执行情况,包括在其上运行的进程。为此,我想要每个进程执行的指令和它的执行跟踪,并且我想在不去获取每个进程的objdump的情况下这样做。
所以我的目标是:
1)建立每个pid的地址空间。
2)跟踪每个pid的执行。
为了实现上述目标,我在仿真器Qemu上运行一个基于linux的操作系统。
当qemu第一次遇到指令时,我将使用io端口或来宾操作系统中的已知物理内存地址来检查运行此指令的进程的pid。然后,我可以使用这些信息来做我想做的事情。
我的问题是...我能知道下一步要执行的进程的pid在内核中的什么位置吗?这意味着我不能理解像-> launch_process(pid).Can这样的函数调用,请告诉我在内核中的这个位置。或者在系统中有一个已知的位置,我们可以在那里跟踪地址空间。一个是CR3,但我真的不能信任它。
对于一些人来说,这似乎是一个指向这个位置的微不足道的指针,但我自己却找不到这个位置。
发布于 2012-01-25 23:44:23
每个进程都有相应的struct task_struct。您可以使用find_task_by_*()函数根据PID查找struct task_struct,也可以使用task_pid_*()获取给定任务的PID。另请参阅include/linux/pid.h中的“什么是结构pid?"部分。
正在运行的任务在每个CPU的运行队列中:请参阅kernel/sched.c中的struct rq定义。
函数try_to_wake_up()、wake_up_process()、wake_up_new_task()、context_switch()和其他函数也与您的任务相关。
https://stackoverflow.com/questions/8983807
复制相似问题