03.06.2013 Views

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 ...

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!