Un modello integrato control-flow e data-flow per il rilevamento ...
Un modello integrato control-flow e data-flow per il rilevamento ...
Un modello integrato control-flow e data-flow per il rilevamento ...
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
54 4. L’implementazione<br />
L’aggregato poi verrà copiato in un buffer in user space, che potrà essere letto ed<br />
elaborato dai consumer. La sintassi <strong>per</strong> specificare un aggregato è @[record1, record2, . . .]<br />
e, nel nostro caso, è stato inserito <strong>il</strong> nome della chiamata di sistema (probefunc)<br />
e lo stack (ustack()). Procedendo in questo modo DTrace, ad ogni ingresso nella<br />
chiamata di sistema, costruisce una struttura dati apposita (Figura 4.5) alla quale si<br />
può accedere da un consumer scritto in C. L’intero aggregato è rappresentato da una<br />
struttura denominata dtrace agg<strong>data</strong> la quale contiene un array (dtrace aggdesc)<br />
che punta ai vari record. Ogni record ha un particolare tipo di dati, nel nostro caso<br />
probefunc è un char * mentre ustack() è un array di uint64 t.<br />
dtrace_agg<strong>data</strong><br />
dtada_desc<br />
dtada_<strong>data</strong><br />
dtada_<strong>per</strong>cpu[0]<br />
dtada_<strong>per</strong>cpu[1]<br />
dtrace_aggdesc<br />
dtagd_rec[1]<br />
dtagd_rec[2]<br />
probename<br />
ustack<br />
...<br />
dtrace_recdesc<br />
dtrd_offset<br />
dtrace_recdesc<br />
dtrd_offset<br />
Figura 4.5: Strutture dati usate da un consumer DTrace.<br />
<strong>Un</strong> consumer ha la funzione di prendere uno script DTrace, comp<strong>il</strong>arlo e passare<br />
l’oggetto risultante al framework DTrace. Questi dettagli sono gestiti con poche<br />
chiamate alla libreria. Fatto questo, si può entrare in un loop e iniziare a consumare<br />
i dati che arrivano dal kernel.<br />
All’interno di un loop infinito si chiama inizialmente la funzione dtrace work(),<br />
la quale si occupa di collezionare tutti i dati necessari. All’uscita da dtrace work()<br />
sono disponib<strong>il</strong>i gli aggregati che sono stati collezionati nell’ultimo ciclo. Questi<br />
vengono processati uno ad uno tramite una funzione walk() definita dall’utente che<br />
lavora sui singoli record. All’interno di walk(), <strong>per</strong> accedere ai valori probefunc e