Как перехватить доступ к памяти без выравнивания?

Я работаю над любимым проектом с открытым исходным кодом, который реализует некоторые алгоритмы потокового шифра, и у меня возникают проблемы с ошибкой, возникающей только тогда, когда я запускаю ее на процессоре ARM. Я даже пытался запустить двоичный файл ARM в x86 под qemu, но ошибка там не возникает.

Конкретные механизмы ошибки остаются неясными, но лучше всего полагать, что это вызвано попыткой доступа к памяти без выравнивания, выполненной в моей программе, которая выполняется qemu, но игнорируется реальным процессором ARM в моей плате разработки.

Итак, поскольку проблема показывает, что ее очень трудно диагностировать, я хотел бы знать, есть ли какой-либо инструмент, который я мог бы использовать для отслеживания невыровненного доступа к памяти, сделанного моей работающей программой, чтобы я мог точно видеть, где происходит проблема.

Я также мог бы использовать какой-либо способ включения на моей плате разработки ARM некоторого сигнала (возможно, SIGBUS?), Если процесс нарушает ограничения выравнивания памяти, например, мы получаем SIGSEGV при доступе к не отображенному адресу памяти. Это работает под управлением Linux 2.6.32.

2 ответа

Решение

Linux может сделать исправление для вас или предупредить о доступе.

Вы можете включить поведение в /proc/cpu/alignment, см. http://www.mjmwired.net/kernel/Documentation/arm/mem_alignment для объяснения различных значений.

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 поддерживает список исключений обработчика выравнивания,

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

Он активен только с procfs, но трудно представить систему без procfs. Конкретный код обработки этого находится в alignment.c. Ты можешь использовать echo 3 > /proc/cpu/alignment чтобы исправить Linux инструкцию и предоставить некоторые dmesg выход. Как правило, обработка несогласованного доступа с помощью эмуляции очень неэффективна. Лучше исправить код. Опция сигнала с подключенным отладчиком должна дать некоторое представление об источнике исключения.

Прочтите руководство.;-)

Другие вопросы по тегам