PID текущего выполняющегося процесса - PullRequest
5 голосов
/ 24 января 2012

Друзья, я пытаюсь отследить полное выполнение операционной системы, включая процессы, запущенные поверх нее.Для этого мне нужны инструкции, выполняемые каждым процессом, и трассировка его выполнения, и я хочу сделать это без необходимости использовать objdump для каждого процесса.

Итак, мои цели:1) Построение адресного пространства каждого пида.2) Отслеживание выполнения каждого пида.

Для достижения вышеуказанных целей я использую операционную систему на основе linux поверх эмулятора Qemu.

Когда qemu впервые встречает инструкцию, я проверю pid процесса, выполняющего эту инструкцию, используя io-порт или известный адрес физической памяти в гостевой системе.Затем я могу использовать эту информацию, чтобы делать то, что мне нужно.

Моя проблема в том ... где в файле kernel / sched.c я могу узнать pid процесса, который будет выполнен следующим,Означает, я не могу понять вызов функции, как -> launch_process (pid). Может кто-нибудь, пожалуйста, укажите мне это место в ядре.Или есть известное место в системе, где мы можем отслеживать адресное пространство.Один из них - CR3, но я действительно не могу ему доверять.

Для некоторых парней это может показаться тривиальным указателем на это местоположение, но я сам не могу найти это местоположение.

1 Ответ

3 голосов
/ 25 января 2012

Каждый процесс имеет соответствующий struct task_struct. Вы можете использовать find_task_by_*() функции, чтобы найти struct task_struct по PID или task_pid_*(), чтобы получить PID данной задачи. Смотрите также «Что такое struct pid?» раздел в include/linux/pid.h.

Выполняемые задачи находятся в очереди выполнения для каждого процессора: см. struct rq определение в kernel/sched.c.

Функции try_to_wake_up(), wake_up_process(), wake_up_new_task(), context_switch() и другие также связаны с вашей задачей.

...