Причины ошибки сегментации в Linux - PullRequest
1 голос
/ 09 февраля 2012

Согласно различным источникам Linux в x86 пытается избавиться от сегментации, устанавливая все 4 сегмента (пользовательский код, пользовательские данные, код ядра, данные ядра) на 0x00000000 и ограничивая 0xfffff, и обрабатывает доступ к памяти на уровне подкачки.

С этой настройкой, почему все еще возможно получить SIGSEGV (segfault)?

Или SIGSEGV используется в более широком «нарушении доступа», означающем здесь, а фактическая причина - ошибка страницы?

Ответы [ 2 ]

2 голосов
/ 09 февраля 2012

Как вы говорите, SIGSEGV используется как «нарушение доступа».
Фактическая причина в том, что вы обратились к указателю на память, которая не отображается в текущем процессе.
Существует несколько вариантов этого (например, несуществующие страницы, нет существующих сегментов, страницы ядра, запись на страницы только для чтения), все они заканчиваются SIGSEGV.

2 голосов
/ 09 февраля 2012

Ошибка страницы приведет к нарушению сегментации только при наличии доступа к странице без резервной памяти;в противном случае ММ попытается загрузить страницу с диска или подкачки.Нарушение сегментации также возможно, если процесс пытается получить доступ к нижним 64 КБ памяти, поскольку он защищен, чтобы отлавливать глупые ошибки программиста, такие как разыменование NULL.

...