2012-01-24 34 views
5

Amici, sto cercando di tracciare l'esecuzione completa di un sistema operativo inclusi i processi in esecuzione su di esso. Per questo voglio le istruzioni eseguite da ogni processo e la sua traccia di esecuzione e voglio farlo senza dover andare a prendere objdump di ogni processo.pid del processo attualmente in esecuzione

Quindi i miei obiettivi sono:
1) Costruire lo spazio degli indirizzi di ciascun pid.
2) Monitoraggio dell'esecuzione di ciascun pid.

Per raggiungere gli obiettivi di cui sopra, eseguo un sistema operativo basato su linux su un emulatore Qemu.

Quando qemu incontra un'istruzione per la prima volta, verificherò il pid del processo che esegue questa istruzione utilizzando un io-port o un indirizzo di memoria fisica noto nel guest. Posso quindi usare queste informazioni per fare ciò che voglio.

Il mio problema è ... dove nel kernel/sched.c posso conoscere il pid del processo che verrà eseguito successivamente. Significa che non sono in grado di capire una funzione chiamata come -> launch_process (pid). Può qualcuno indicarmi questa posizione nel kernel. O c'è una posizione nota nel sistema in cui possiamo tracciare lo spazio degli indirizzi. Uno è CR3 ma non posso davvero fidarmi.

Per alcuni ragazzi questo potrebbe sembrare un puntatore banale a questa posizione, ma non sono in grado di trovare da solo questa posizione.

risposta

3

Ogni processo è appropriato struct task_struct. È possibile utilizzare le funzioni find_task_by_*() per trovare struct task_struct tramite PID o task_pid_*() per ottenere il PID dell'attività assegnata. Vedi anche "Cos'è struct pid?" sezione in include/linux/pid.h.

Le attività in esecuzione sono in runqueue per CPU: vedere la definizione struct rq in kernel/sched.c.

Funzioni try_to_wake_up(), wake_up_process(), wake_up_new_task(), context_switch() e altri sono anche in relazione all'attività da svolgere.

+0

@droid grazie ... context_switch è la funzione in cui il pid del processo in esecuzione cambia. È qui che intendo inserire il codice utilizzando task_struct in seguito. C'è qualche altro punto d'ingresso per il cambio di pid ?? Questo metodo potrebbe funzionare anche per un sistema smp ?? –

+0

Non ho familiarità con il kernel, quindi rispondo sicuramente ad altri punti di accesso simili. Per quanto riguarda SMP, penso che tutto dovrebbe andare bene. –

Problemi correlati