Системный вызов nanosleep() просыпается с ошибкой шины?
Я смотрю на дамп ядра из встроенного приложения MIPS Linux. GDB сообщает о SIGBUS, и поток, обрабатывающий сигнал, кажется, находится в системном вызове для nanosleep - код более высокого уровня, в основном называемый sleep(очень долгое время); Предполагая, что другой процесс не отправил этот сигнал приложению, что могло бы вызвать пробуждение этого потока следующим образом? Что-то внутри ядра вызвало ошибку шины? Может ли это быть вызвано другим потоком, который блокирует такие сигналы? (прошу прощения за любую наивность здесь, я не слишком осведомлен о сигналах). Благодарю.
1 ответ
Если si_pid
установлен на адрес, это означает, что ваш SIGBUS был вызван ошибкой в программе. Обычно это происходит, когда ядро пытается листать текст программы, но сталкивается с ошибкой ввода-вывода. Переполнение стека также может вызвать это.
Ты видишь si_pid
установить адрес, потому что si_pid
является частью союза, и псевдоним с si_address
, Особенно, si_pid
действует только если si_code == SI_USER
, Вы можете получить больше информации от si_code
член:
The following values can be placed in si_code for a SIGBUS signal:
BUS_ADRALN invalid address alignment
BUS_ADRERR nonexistent physical address
BUS_OBJERR object-specific hardware error
BUS_MCEERR_AR (since Linux 2.6.32)
Hardware memory error consumed on a machine check; action required.
BUS_MCEERR_AO (since Linux 2.6.32)
Hardware memory error detected in process but not consumed; action optional.
Обратите внимание, что невозможно заблокировать исходящие от ядра сигналы SIGBUS - если вы попытаетесь это сделать, ваша программа все равно будет прервана.
Я подозреваю, что ваш отладчик может быть немного сбит с толку относительно происхождения сигнала SIGBUS здесь; это может быть связано с неправильной темой. Возможно, вы захотите изучить другие потоки вашего процесса, чтобы увидеть, делают ли они что-то странное. Кроме того, вы могли столкнуться с ошибкой ввода-вывода при возврате из nanosleep
и пейджинг на странице кода по обратному адресу.