【问题标题】:pid of the currently executing process当前执行进程的pid
【发布时间】:2012-01-24 08:22:54
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: linux architecture linux-kernel scheduling


    【解决方案1】:

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

    运行任务在每个 CPU 的运行队列中:参见 kernel/sched.c 中的 struct rq 定义。

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

    【讨论】:

    • @droid 感谢 ... context_switch 是执行进程的 pid 更改的函数。这是我接下来打算使用 task_struct 放置代码的地方。是否有任何其他更改 pid 的入口点?这种方法也适用于 smp 系统吗??
    • 我对内核不太熟悉,因此可以肯定地回答其他此类入口点。至于 SMP - 我认为一切都应该没问题。
    猜你喜欢
    • 2012-07-02
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多