2016-02-22 14 views
7

Mi piacerebbe capire come funziona il processo VMMAP.Individuare il simbolo __proc_info nel progetto XNU

Dopo aver eseguito questo file eseguibile con dtrace, sembra che il metodo proc_regionfilename che estrae lo spazio di indirizzi di ogni sezione nella memoria virtuale.

Così, ho scavato un po 'più profonda, e ha trovato la sua attuazione in XNU sotto il file
libsyscall/involucri/libproc/libproc.c

Nel corpo della funzione vedo che la chiamata principale è quello di proc_pidinfo:

retval = proc_pidinfo(pid, PROC_PIDREGIONPATHINFO, (uint64_t)address, &reginfo, sizeof(struct proc_regionwithpathinfo)); 

E proc_pidinfo che chiede a sua volta a __proc_info simbolo:

int __proc_info(int callnum, int pid, int flavor, uint64_t arg, void * buffer, int buffersize); 

Tuttavia, questo simbolo c annot si trova nel codice, e mi chiedo come è stato creato durante la pre-compilazione, compilazione, link o in tempo reale.

Qualche idea su dove trovarlo, o come viene creato (non ho ancora provato a compilare il kernel).

grazie

risposta

1

proc_info è una chiamata di sistema, quindi è implementazione è nel kernel. Il codice sorgente per la versione che si trova in 10.11.2 può essere trovato qui:

http://opensource.apple.com/source/xnu/xnu-3248.20.55/bsd/kern/proc_info.c

+0

Grazie, ma perché lo fa dichiarazione libproc.c è realizzato in forma maciullato (__proc_info invece di proc_info)? – Zohar81

+0

Penso che "__proc_info' sia lo shif di syscall che trasforma la normale convenzione di chiamata di funzioni in convenzione di syscall e in effetti causa la trap allo spazio del kernel. Questi vengono generati automaticamente dalla tabella syscall del kernel, quindi non troverete alcun codice sorgente diretto per loro. Non sicuro al 100%. – pmdj