Низкоуровневый «горячий» сброс

reset.cpp

После получения нужной начальной информации, следует инициировать некое начальное известное состояние.

А именно:

  • подготовить страничную сегментацию;
  • настроить сегментные регистры и управляющие регистры;
  • перейти в новое окружение с новым стеком;
  • очистить все регистры общего назначения.

В отличие от официальной документации по страничной сегментации процессоров типа x86, в коде используется понимание страницы как страницы книги, то есть каталог страниц — книга (book), а указатель каталога — полка (rack).

Размер страницы для операционной системы был выбран равным 2МБ вместо 4КБ с целью уменьшения вложенности. Принципиально ничего не мешает использовать иерархию: страница (4КБ) — книга (2МБ) — полка (1ГБ) — стеллаж (512ГБ).

В связи с тем, что на момент написания статьи, у процессоров отсутствует поддержка адресов длинной более 36 бит реальных адресов (64ГБ), использовать «стеллаж» бессмысленно. А при странице 2МБ, достаточно одной «полки».

Переход в новое окружение происходит вызовом «голой» функции restart, перед вызовом которой проталкиваются все необходимые параметры. Вызов iret вместо ret инициирует использование этих параметров.