c linux arm memory-alignment

Cómo atrapar el acceso a la memoria no alineada?



linux arm (2)

Linux puede hacer la corrección por ti o advertir sobre el acceso.

Puede habilitar el comportamiento en / proc / cpu / alignment; consulte http://www.mjmwired.net/kernel/Documentation/arm/mem_alignment para obtener una explicación de los diferentes valores.

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

Estoy trabajando en un proyecto de código abierto para mascotas que implementa algunos algoritmos de cifrado de flujo y estoy teniendo problemas con un error que se dispara solo cuando lo ejecuto en un procesador ARM. Incluso he intentado ejecutar el binario ARM en x86 bajo qemu, pero el error no se desencadena allí.

Los mecanismos específicos del error siguen siendo difíciles de alcanzar, pero mi mejor opción es creer que es causada por un intento de acceso a memoria no alineado realizado en mi programa, que se cumple con qemu, pero el procesador ARM real de mi placa de desarrollo lo ignora silenciosamente.

Entonces, dado que el problema muestra que es muy difícil de diagnosticar, me gustaría saber si hay alguna herramienta que pueda usar para atrapar el acceso a la memoria no alineada que hace mi programa en ejecución, para que pueda ver exactamente dónde ocurre el problema.

También podría usar alguna forma de habilitar, en mi placa de desarrollo ARM, alguna señal (¿SIGBUS, tal vez?) Para ser emitida si el proceso viola las restricciones de alineación de memoria, como cuando obtenemos SIGSEGV cuando accedemos a la dirección de memoria no asignada. Está ejecutando Linux 2.6.32.


ARM Linux mantiene una lista de excepciones del manejador de alineación ,

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

Solo está activo con procfs , pero es difícil imaginar un sistema sin procfs . El código específico que maneja esto está en alineación.c . Puede usar echo 3 > /proc/cpu/alignment para que Linux corrija las instrucciones y proporcione alguna salida de dmesg . Generalmente, el manejo de accesos no alineados a través de la emulación es muy eficiente. Es mejor corregir el código. La opción de señal con un depurador adjunto debería dar alguna pista sobre el origen de la excepción.

Lee el manual . ;-)