Portare Valgrind pe MIPS
description
Transcript of Portare Valgrind pe MIPS
Ce este LibVEX?
Biblioteca de translaţie ce funcţionează ca parte a nucleului Valgrind
Permite instrumentarea codului într-o manieră generică
Specificaţii funcţionale:
Primeşte de la nucleu un bloc de cod maşină aparţinând programului analizat
Execută translaţia în reprezentare intermediară (RI), optimizarea codului, instrumentarea lui cu ajutorul funcţiilor oferite de utilitare şi translaţia inversă
Întoarce nucleului cod maşină gata de execuţie
Relaţia cu nucleul
• LibVEX_Init – funcţie apelată de nucleu pentru iniţializarea bibliotecii de translaţie
• LibVEX_Translate – execută translaţia unui bloc de cod
Structura bibliotecii
Oglindeşte designul Valgrind - Combinaţie de module generice şi module dependente de arhitectură care acoperă toate fazele translaţiei
Structura bibliotecii - detalii
Fiecare arhitectură deţine două module: Guest – translaţie cod binar → RI Host – translaţie RI → cod binar Plus părţi generice care ajută translaţiile
Reprezentarea intermediară (ir) Funcţii pentru interfaţarea cu RI Funcţii pentru optimizări (eliminarea codului nefolosit,
propagarea constantelor, etc.) Interfaţa principală a bibliotecii (main)
! Pentru portare pe MIPS trebuie introduse module guest/host specifice arhitecturii !
Reprezentarea intermediară
Declaraţii – operaţii cu efecte laterale Scrieri în memorie / regiştri, atribuire de valori
temporarelor, etc.
Expresii – operaţii fără efecte laterale Operaţii aritmetice, încărcări din memorie, constante Pot conţine subexpresii => structuri arborescente
Exemplu t1 = (3+(4*load(adr1))
Blocuri de cod – secvenţe de instrucţiuni Un singur punct de intrare, mai multe puncte de ieşire Conţin o listă de declaraţii reprezentând codul efectiv Se încheie cu o instrucţiune de salt la blocul următor
Portarea pe MIPS – Modulul de dezasamblare
E oferit un set redus de instrucţiuni – instrucţiuni din user-space MIPS I ce apar frecvent
Se dezasamblează instrucţiune cu instrucţiune
Rezultă o listă de declaraţii RI care conţin expresii (structură arborescentă)
La terminarea blocului de cod se notează adresa următorului bloc
Portarea pe MIPS – Modulul de dezasamblare (2)
Exemplu:bne a1, v1, 0x17addu gp, gp, t9
IRBB {
---------IMark(0xFF, 4)---------t0 = CmpNE32(GET:I32(20),
GET:I32(12))
---------IMark(0x103, 0)--------PUT(128) = 0x103:I32PUT(112) =Add32(GET:I32(112),GET:I32(100))if (t0)
goto {Boring} 0x15F:I32goto {Boring} 0x107:I32
}
Portarea pe MIPS – Selectorul de instrucţiuni
Instrucţiunile MIPS sunt modelate la modul abstract cu ajutorul unor structuri
Blocul de cod în reprezentare intermediară este parcurs declaraţie cu declaraţie
Pentru o declaraţie se parcurge întreg arborele de expresii asociat
În final rezultă o listă de instrucţiuni reprezentate abstract
Portarea pe MIPS – Selectorul de instrucţiuni (2)
IRBB {-----IMark(0xFF, 4)------t0 =CmpNE32(GET:I32(20),
GET:I32(12))-----IMark(0x103, 0)----- PUT(128) = 0x103:I32PUT(112) =
Add32(GET:I32(112),GET:I32(100))
if (t0) goto {Boring} 0x15F:I32
goto {Boring} 0x107:I32}
mflr %r2lw %r3,20(%r25)lw %r4,12(%r25)word_compare %r5 =
ne( %r3, %r4 )
li_word %r3,0x0000000000000103
sw %r3,128(%r25)lw %r3,112(%r25)lw %r4,100(%r25)addu %r6,%r3,%r4sw %r6,112(%r25)goto: if ( %%r5 ){ 351 }mtlr %r2goto: (always) { 263 }
Portarea pe MIPS – Generatorul de cod
• Parcurge blocul de cod instrucţiune cu instrucţiune• Rezultă un şir de caractere reprezentând codul binar gata de
execuţie• Organizat pe nivele
Nivel 3 – identifică structura fizică a instrucţiunilor studiind reprezentarea abstractă
Nivel 2 – uneşte componentele unei instrucţiuni într-un întreg pe 32 de biţi
Nivel 1 – primeşte un întreg pe 32 de biţi şi îl adaugă la şirul de ieşire
Portare pe MIPSPaşii următori
Suport pentru maşini ce folosesc reprezentarea big-endian (modulele de dezasamblare şi generare de cod)
Extinderea setului de instrucţiuni maşină oferite Suport pentru operaţii în virgulă mobilă Extindere de la arhitectura MIPS I la MIPS32
Referinţe
• http://www.valgrind.org• http://www.mips.com
Intrebări?