Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Разработка операционных систем - для начинающих и не только!


Информационный Канал Subscribe.Ru

Разработка операционных систем

Выпуск 20 от 2003-07-07

Сегодня в номере:

Intro

Новость. После месяца упорной работы вышла в свет версия 0.01 операционной системы Tyros/Neutronix, которая уже является слегка работоспособной системой (это означает, что она может запускать несколько программ с рамдиска :)

Образ дискеты с ОС и исходники вы можете забрать по адресу:
http://sf.net/projects/tyros/

Реализация виртуальной памяти на IA-32 (продолжение)

Как вы помните, в прошлом выпуске мы рассмотрели возможные способы отображения виртуального адресного пространства на физическую память. Но у системы виртуальной памяти есть еще один очень важный компонент - это исключение 11 - несуществующий сегмент и исключение 14 - page fault ака ошибка страничной адресации. Первое из них предназначено для организации виртуальной памяти на уровне сегментов и генерируется при попытке использования сегмента или шлюза, в дескрипторе которого бит P равен 0.

Исключение 14 генерируется в тех случаях, когда процессор не знает как обработать доступ к определенной странице памяти. Тут необходимо отметить, что page fault, хотя он и называется ошибкой, вовсе не является чем-то из ряда вон выходящим - процессор просто сообщает, что доступ нельзя осуществить аппаратными средствами и это придется делать программному обработчику.

При возникновении page fault процессор загружает в регистр CR2 адрес той ячейки памяти, обращение к которой вызвало сбой, а в стек помещает код ошибки, который имеет следующий формат:

  • бит 0: 0 - обращение к несуществующей странице, 1 - нарушение привилегий при обращении к странице
  • бит 1: 0 - ошибка произошла при чтении, 1 - при записи
  • бит 2: 0 - процессор был в режиме супервизора, 1 - в режиме пользователя
  • бит 3: 0 - ошибка не была вызвана установкой зарезервированных битов элемента каталога страниц, 1 - была вызвана именно этим :)

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

Заметьте, все это происходит прозрачно для процесса!

А теперь рассмотрим алгоритм одного из методов организации виртуальной памяти на IA-32 - demand allocation (выделение по требованию):

  • Пользовательская программа осуществляет запрос на выделение памяти
  • Система выделяет соответствующее количество страниц виртуального адресного пространства
  • Элементы таблицы страниц для выделенных устанавливаются в значение "Выделено" (это может быть любая константа, главное чтобы бит 0 был установлен в 0 - физически эти страницы еще не существуют)
  • При обращении к ячейке памяти принадлежащей одной из этих страниц, процессор заметит что бит 0 установлен в 0 и сгенерирует page fault
  • Обработчик page fault посмотрит на соответствующий сбойному адресу (как мы помним он помещается в cr2) элемент таблицы страниц. Если он равен значению "Выделено", то выделяется физическая страница памяти, а элемент таблицы изменяется таким образом, что указывает на свежевыделенный физический адрес
  • Обработчик прерывания возвращает управление программе

Итак, с помощью этого метода память будет выделятся только тогда, когда она реально будет требоваться. Приложение может запросить хоть гигабайт, но все что оно получит - изменение элементов каталога страниц.

Я не привожу примеров кода (поскольку для реализации вышеописанных методов в системе уже должна быть серьезная инфраструктура), но самых любопытных отсылаю к исходникам Tyros, а именно:

  • hal/ia32/paging.c - функции работы с каталогом страниц
  • hal/ia32/vm.c - менеджер виртуальной памяти

Outro

На сегодня все, уважаемые подписчики.
Как всегда, мой почтовый ящик открыт для вас:
lonesome@lowlevel.ru
Также вы можете задавать интересующие вас вопросы в форуме lowlevel.ru
Предыдущие выпуски рассылки вы можете найти по этому адресу:
http://subscribe.ru/archive/comp.soft.prog.osdev
А все, исходники, опубликованые в рассылке, располагаются здесь:
http://www.lowlevel.ru/osdev/sources.htm
Всего наилучшего!
Lonesome



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное