Каждый процесс получает непрерывное ЛОГИЧЕСКОЕ адресное пространство. Не непрерывное ВИРТУАЛЬНОЕ адресное пространство.
Логические СТРАНИЦЫ сопоставляются с физическими КАДРАМИ СТРАНИЦ.
Логическое сопоставление выполняется с использованием ТАБЛИЦЫ СТРАНИЦ, содержащей сопоставления локальных страниц с фреймами страниц.
Однако таблица страниц может не иметь отображения на страничный фрейм для каждой логической страницы.
Есть две причины, по которым это может произойти. Во-первых, операционная система не может (и обычно не делает) создавать записи таблицы страниц, охватывающие все адресное пространство. Системные параметры или квоты процессов могут ограничивать размер логического адресного пространства. Некоторые системы также резервируют диапазоны адресов как непригодные для использования.
Во-вторых, кто-то должен сделать сопоставление логических страниц. Это двухэтапный процесс. (1) Кто-то (обычно загрузчик) должен пометить логические страницы как допустимые. (2) операционная система должна сопоставить логическую страницу с физической страницей. Это делается, когда процесс обращается к действительной логической странице, не имеющей сопоставления, что приводит к ошибке страницы. (это виртуальная память — динамическое переназначение допустимой логической страницы на страничный фрейм).
Запись в таблице страниц может иметь три состояния:
- Это недействительно
- Он действителен и сопоставляется с фреймом страницы сопоставления.
- Он действителен, но не имеет сопоставления с физическим фреймом страницы. (Опять же, если есть доступ к записи таблицы страниц в этом состоянии, это вызывает ОШИБКУ СТРАНИЦЫ, которая заставляет операционную систему создать сопоставление с действительным фреймом страницы.)
Во время выполнения приложение может вызывать системные службы, чтобы сделать логические страницы допустимыми в логическом адресном пространстве.
В качестве меры безопасности для обнаружения случайных указателей большинство систем (обычно управляемых компоновщиком) вообще не отображают первую страницу (однако приложение обычно может отображать страницу с помощью системных вызовов). Ваш:
int *a = 1 ;
Устанавливает адрес "a" в положение, которое будет на первой странице, что всегда недопустимо.
Ваш
*a = 5 ;
заставляет процессор (блок преобразования памяти) обращаться к записи таблицы страниц для первой страницы. Там процессор обнаруживает, что эта запись в таблице страниц помечена как недопустимая (т. е. не имеющая возможного отображения). Это вызывает нарушение доступа.
person
user3344003
schedule
26.02.2016
every process receives a contiguous address space which is mapped to physical memory
Это вопрос операционной системы, зависящий от ее обработки памяти.following code in C which throws an exception
Это вопросC
кода. СтандартC
ничего не знает о конкретной ОС, которую вы, возможно, имеете в виду, и не может решить эту часть. Что касается стандартаC
, память, которую вы не получили каким-либоC
стандартным способом (например,malloc
или определением переменной), не существует для практических целей и вызывает UB (неопределенное поведение) при обращении к ней. - person dxiv   schedule 25.02.2016