системный вызов nanosleep () просыпается с ошибкой шины? - PullRequest
1 голос
/ 26 сентября 2011

Я смотрю дамп ядра из встроенного приложения MIPS Linux. GDB сообщает о SIGBUS, и поток, обрабатывающий сигнал, кажется, находится в системном вызове для nanosleep - код более высокого уровня, в основном называемый sleep (очень долгое время); Предполагая, что другой процесс не отправил этот сигнал приложению, что могло бы вызвать пробуждение этого потока следующим образом? Что-то внутри ядра вызвало ошибку шины? Может ли это быть вызвано другим потоком, который блокирует такие сигналы? (прошу прощения за любую наивность здесь, я не слишком осведомлен о сигналах). Спасибо.

1 Ответ

3 голосов
/ 27 сентября 2011

Если для адреса 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 и переходом на страницу кода по адресу возврата.

...