2012-02-09 2 views
1

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

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

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

ответ

2

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

2

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

Смежные вопросы