Как перехватить доступ к памяти без выравнивания?
Я работаю над любимым проектом с открытым исходным кодом, который реализует некоторые алгоритмы потокового шифра, и у меня возникают проблемы с ошибкой, возникающей только тогда, когда я запускаю ее на процессоре 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
выход. Как правило, обработка несогласованного доступа с помощью эмуляции очень неэффективна. Лучше исправить код. Опция сигнала с подключенным отладчиком должна дать некоторое представление об источнике исключения.
Прочтите руководство.;-)