2012-01-24 14 views
5

Amigos, estoy tratando de rastrear la ejecución completa de un sistema operativo, incluidos los procesos que se ejecutan en la parte superior. Para esto quiero las instrucciones ejecutadas por cada proceso y su seguimiento de ejecución y quiero hacer esto sin tener que ir y tomar objdump de cada proceso.pid del proceso actualmente en ejecución

Mis objetivos son:
1) Construir el espacio de direcciones de cada pid.
2) Ejecución de seguimiento de cada pid.

Para lograr los objetivos anteriores, estoy ejecutando un sistema operativo basado en Linux sobre un emulador Qemu.

Cuando qemu encuentra una instrucción por primera vez, verifico el pid del proceso que ejecuta esta instrucción usando un io-puerto o una dirección de memoria física conocida en el invitado. Entonces puedo usar esta información para hacer las cosas que quiero.

Mi problema es ... donde en kernel/sched.c puedo saber el pid del proceso que se va a ejecutar a continuación. Significa que no puedo encontrar una llamada a función como -> proceso_de_ejecución (pid). Puede alguien indicarme esta ubicación en el kernel. O hay una ubicación conocida en el sistema donde podemos rastrear el espacio de direcciones. Uno es CR3 pero realmente no puedo confiar en él.

Para algunos, esto puede parecer un indicador trivial de esta ubicación, pero no puedo encontrar esta ubicación yo mismo.

Respuesta

3

Cada proceso tiene struct task_struct apropiado. Puede usar las funciones find_task_by_*() para encontrar struct task_struct por PID o task_pid_*() para obtener el PID de la tarea especificada. Consulte también "¿Qué es struct pid?" sección en include/linux/pid.h.

Las tareas en ejecución están en ejecución de CPU por CPU: consulte la definición struct rq en kernel/sched.c.

Funciones try_to_wake_up(), wake_up_process(), wake_up_new_task(), context_switch() y otros también están relacionados con su tarea.

+0

@droid gracias ... context_switch es la función donde cambia el pid del proceso que se está ejecutando. Aquí es donde pretendo poner el código usando task_struct a continuación. ¿Hay algún otro punto de entrada para el cambio de pid? ¿Este método funcionaría para un sistema smp también? –

+0

No estoy tan familiarizado con el núcleo como para responder seguramente sobre otros puntos de entrada. En cuanto a SMP, creo que todo debería estar bien. –

Cuestiones relacionadas