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

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

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

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

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

Ответ 1

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

Ответ 2

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

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