Что может вызвать SIGBUS (ошибка шины) на универсальном x86 приложении пространства пользователя в Linux? Все обсуждение, которое я был в состоянии найти онлайн, расценивает ошибки выравнивания памяти, который от того, что я понимаю, действительно не относится к x86.
(Мой код работает на Жеоде, в случае, если существуют любые соответствующие определенные для процессора причуды там.)
Вы можете получить SIGBUS от не выровненного доступа, если вы включите не выровненную ловушку доступа, но обычно она выключена на x86. Вы также можете получить SIGBUS из выровненной ловушки доступа, если есть какая-то ошибка.
Лучше всего использовать отладчик для определения команды ошибки (SIGBUS синхронизирован), и пытаться увидеть, что он пытался сделать.
Общая причина ошибки шины на X86 Linux пытается разымевать то, что не совсем указатель, или является диким указателем. Например, не удалось инициализировать указатель или присвоение произвольного целого числа к указателю, а затем попытка разымевать, он обычно изготавливает либо ошибку сегментации, либо ошибку шины.
Выравнивание применяется к x86. Несмотря на то, что память на X86 является байтом-адресуемым (так что вы можете иметь указатель Char на любой адрес), если у вас есть например, указатель на 4-байтовое целое число, этот указатель должен быть выровнен.
Вы должны запустить вашу программу в GDB и определить, какой доступ к указателю генерирует ошибку шины для диагностики проблемы.
О да, есть еще один странный способ получить sigbus.
Если ядро не удается на странице в кодовой странице из-за давления памяти (убийца OOM должна быть отключена) или не удалась запрос IO, SIGBUS.
SIGBUS
может произойти в Linux в течение многих причин, отличных от неисправностей выравнивания памяти - например, если вы пытаетесь получить доступ к области MMAP
, за конец сопоставленного файла.
Вы используете что-нибудь вроде MMAP
, общие регионы памяти или аналогичные?