Come intrappolare l’accesso alla memoria non allineato?

Sto lavorando a un progetto open source per animali domestici che implementa alcuni algoritmi di cifratura a stream e ho problemi con un errore triggersto solo quando lo eseguo su un processore ARM. Ho anche provato a eseguire il binario ARM in x86 sotto qemu, ma il bug non viene triggersto lì.

I meccanismi specifici del bug rimangono elusivi, ma il mio colpo migliore è credere che sia causato da un tentativo di accesso alla memoria non allineato fatto nel mio programma, che è soddisfatto da qemu, ma silenziosamente ignorato dal vero processore ARM nella mia scheda di sviluppo.

Quindi, dal momento che il problema si sta rivelando molto difficile da diagnosticare, vorrei sapere se esiste uno strumento da utilizzare per intercettare l’accesso alla memoria non allineato creato dal mio programma in esecuzione, in modo da poter vedere esattamente dove si verifica il problema.

Potrei anche usare un qualche modo per abilitare, sulla mia scheda di sviluppo ARM, qualche segnale (SIGBUS, forse?) Da emettere se il processo viola le restrizioni di allineamento della memoria, come se ricevessimo SIGSEGV quando accediamo all’indirizzo di memoria non mappato. È in esecuzione Linux 2.6.32.

Linux può fare la correzione per te o avvisare dell’accesso.

È ansible abilitare il comportamento in / proc / cpu / alignment, vedere http://www.mjmwired.net/kernel/Documentation/arm/mem_alignment per una spiegazione dei diversi valori.

0 - Do nothing (default behavior) 1 - Warning in kernel-log with PC and Memory-Address printed. 2 - Fixup error 3 - Warn and Fixup 4 - Send a SIGBUS to the process 5 - Send SIGBUS and output Warning 

ARM Linux mantiene un elenco di eccezioni del gestore di allineamento ,

 $ cat /proc/cpu/alignment User: 0 System: 0 Skipped: 0 Half: 0 Word: 0 DWord: 0 Multi: 0 User faults: 0 (ignored) 

È attivo solo con procfs , ma è difficile immaginare un sistema senza procfs . Il codice specifico che gestisce questo è in alignment.c . Puoi usare echo 3 > /proc/cpu/alignment per avere Linux che aggiusta le istruzioni e fornisce qualche output dmesg . In generale, gestire gli accessi non allineati tramite l’emulazione è molto inefficiente. È meglio correggere il codice. L’opzione di segnale con un debugger collegato dovrebbe dare qualche indizio sull’origine dell’eccezione.

Leggi il manuale . 😉