2010-06-26 18 views
11

Voglio fare un semplice compilatore just-in-time con c su Linux.Assembla ram eseguibile in c su linux

Come è possibile allocare memoria in modo che sia possibile scrivere codice x86 grezzo ed eseguirlo come qualsiasi altra funzione?

risposta

15

Vedere mprotect(). Dopo aver riempito un'area di memoria (n-) di dimensioni di pagina (allocata con mmap()) con il codice, modificare le autorizzazioni per disabilitare le scritture e consentire l'esecuzione.

+0

Inoltre, leggi questo: http://people.redhat.com/drepper/selinux-mem.html –

+0

@Ignacio: link is down, archive link: http://web.archive.org/web/20090203055327/ http://people.redhat.com/drepper/selinux-mem.html – ninjalj

6

Oltre a utilizzare mprotect correttamente per fornire prima autorizzazione di scrittura e quindi esecuzione, su alcune operazioni OS/hardware potrebbe essere necessario svuotare l'I-cache. In questo momento (metà 2010), tutti i processori x86 recenti hanno cache di livello 1 separate per istruzioni e dati e qualcuno deve assicurarsi che se si scrivono nuove istruzioni in memoria (che aggiorneranno la D-cache), non si t quindi provare a eseguire bit stanti dall'I-cache. Il modo esatto per svuotare l'I-cache dallo spazio utente dipenderà sia dall'hardware che dal sistema operativo. Il mio consiglio è di leggere nella documentazione di Intel sul "codice auto-modificante" per i loro multiprocessori IA-32. Questo dovrebbe essere sufficiente per farti passare.

+0

x86 non ha bisogno di questo; Le regole ISA x86 richiedono che I-cache sia coerente con le cache dei dati e al massimo è richiesto un 'jmp' prima che i byte di nuova scrittura siano" visti ". Ma buon punto perché altre architetture non hanno una I-cache coerente. –