Ошибка сегментации и ошибка страницы

  • Мне было интересно, какие различия и отношения между ошибка сегментации и ошибка страницы?

  • Является ли ошибка сегментации только сегментированной моделью памяти?

    Ошибка страницы относится только к модели с постраничной памятью?

    Если оба да, так как большинство компьютерных систем, таких как x86 и Linux, используют модель подкачки памяти вместо модели с сегментированной памятью, почему компилятор GCC C иногда сообщает об ошибке сбоя сегментации?

Спасибо и приветствую!

Ответы

Ответ 1

Эти две вещи очень разные, на самом деле. Ошибка сегментации означает, что программа пыталась получить доступ к недопустимому или нелегальному адресу памяти: например, 0 или значение, большее, чем любой действительный указатель. Ошибка страницы заключается в том, что указатель пытается получить доступ к странице адресного пространства, которая в настоящее время не отображается в физическую память, так что MMU необходимо извлечь ее с диска, прежде чем ее можно будет использовать. Первое - это незаконное условие, и программа, как правило, будет прервана; последний абсолютно нормален, и программа даже не знает об этом.

"Сегментация" вовсе не связана со старой "сегментированной моделью памяти", используемой ранними процессорами x86; это более раннее использование, которое просто относится к части или сегменту памяти.

Ответ 2

Ошибки сегментации возникают, когда доступ к памяти невозможен (не существует или запрещен). Чаще всего они возникают при разыменовании нулевой переменной или завершении конца массива. Ошибки страниц возникают при доступе к памяти, которая отображается, но не загружена. Они не являются ошибками и сигнализируют операционной системе, что она должна загружать соответствующую страницу в память.