Яни, Густав
- 1 year ago
- 0
- 0
SIGSEGV (от англ. signal и segmentation violation ) — сигнал , используемый в POSIX -системах, посылаемый процессу при ошибках сегментации — отказах страниц и других попытках обращения к несуществующей области памяти или при обращениях с нарушением прав доступа .
Определён как целочисленная константа в заголовочном файле
signal.h
. Символьные имена сигналов используются вместо номеров, так как в разных реализациях номера сигналов могут различаться.
В большинстве систем применяется техника подкачки страниц , когда память отображается в адресное пространство процесса страницами размером 4 КБ — 1 ГБ (в зависимости от аппаратной платформы и текущего режима работы процессора), по мере необходимости — по мере выделения памяти процессом. Страницы, в которые ещё ничего не отображено, а также «вытесненные» в процессе свопинга виртуальной памяти, или связанные с ещё незагруженными частями отображённого файла), вызывают отказ страницы. Обрабатывая страничное нарушение для «вытесненной» страницы памяти или незагруженной части файла, операционная система обеспечивает наличие страницы, вызывавшей нарушение (например, подгружая её с накопителя), при возврате к выполнению процесса (и с «вытеснением» другой страницы, если это необходимо). Если же в странице адресного пространства ранее ничего отображено не было, то операционная система посылает процессу сигнал SIGSEGV, чтобы прекратить его выполнение.
Кроме этого, каждая страница адресного пространства имеет атрибуты, разрешающие процессу чтение и запись (а новые процессоры также позволяют запретить выполнение программы из памяти страницы, например, для предотвращения выполнения кода при переполнении буфера в стеке ). При попытке записи, чтения или выполнения программы в странице, в которой это запрещено, возникает нарушение защиты, обрабатывая которое, операционная система посылает процессу сигнал SIGSEGV, чтобы прекратить его выполнение.
Операционная система может предоставить дополнительные данные о возникшей ошибке, используя стек сигнала ( англ. signal stack ), который может помочь разработчику в отладке данной ошибки.
По умолчанию процесс аварийно завершается с генерацией дампа памяти (или другой операции зависящей от платформы), который можно использовать для получения информации об условиях возникновения исключения.
SIGSEGV может быть перехвачен или проигнорирован. Однако игнорирование SIGSEGV, в некоторых случаях, может привести к непредсказуемым результатам .
Примером программы, перехватывающей SIGSEGV, может служить отладчик , который способен проанализировать стек и информировать разработчика, на каком этапе произошла ошибка.