Пишем Ос С Нуля: Часть 2 — 32 Лучше 16



Отказ от ответственности? Привет, Хабр! Это серия статей о написании своей ОС с нуля.

Я большой поклонник ретро-программирования, поэтому мгновенно забуду о существовании EDC. Пожалуйста, не пишите комментарии типа «БИОС давно устарел, где UEFIЭ» Пишу это просто для того, чтобы было что почитать вечером и отдохнуть.

Спасибо.



Давайте договоримся

Если вы не владеете языком ассемблера, вам могут быть трудно понять, что происходит. я использую ассемблер ФАСМ .

В Последняя часть мы написали свой загрузчик из двух этапов: ограниченный кадрами МБР и без ограничений (ну почти), у которого даже есть прекрасный колхоз BSOD .

В этой части мы перейдем в защищенный режим.



Пишем ОС с нуля: Часть 2 — 32 лучше 16

BSOD (да, вот я пытался запустить это чудо в Oracle VMs VirtualBox)

Проблемы х86-16

Ну, думаю, я мог бы написать здесь длинный список.

Выделю, на мой взгляд, самые важные из них:

  1. Ограничение адресации ОЗУ 1 МБ;
  2. 0 защита и изоляция памяти;
  3. Отсутствие некоторых функций.

    Думаю, здесь тоже можно понять, что IA-32 лучше х86-16 как архитектура.



Выходи за меня замуж, OSDev.org!

Да-да.

Это тот самый сайт для медитации в момент брейнкудатушеля.

Я изучил страницы OSdev по защищенному режиму от и до и уже начал впихивать себе в голову монитор.

Через пару часов с помощью Макса (он попросил удалить ссылку) я все понял и начал писать.



Что такое ГДТ и с чем его едят?

Итак, реальный режим плох, есть более удобный вариант - защищенный.

В нем память адресуется линейно, все 4ГБ адресов, которые умещаются в регистре процессора x86. Но за годы работы в реальном режиме мы уже выяснили, что обращаться к физической памяти напрямую очень неудобно (как минимум встает вопрос о загрузке в нее нескольких процессов, чтобы они не конфликтовали), небезопасно (процессы могут нарушать память друг друга), да и вообще памяти вообще может быть меньше 4Гб и было бы удобно назначать разные права на разные участки виртуальной памяти (Чтение, Запись, Выполнение или ничего).

Вот почему они придумали адресацию страниц и виртуальную память.

У каждого процесса есть свои виртуальные 4ГБ, и процессор соотносит виртуальный адрес с реальным, проверяя при этом права на запрошенную операцию.

Для этого виртуальная память делится на страницы.

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

Описание страницы, по-английски — «дескриптор» содержит все эти свойства.

А список всех страниц, соответственно, будет называться таблицей дескрипторов.

Почему стол? Потому что для доступа к разным страницам можно просто указать номер дескриптора нужной страницы в регистре сегмента (теперь это «селектор»).

Было бы удобно иметь глобальную таблицу дескрипторов, одну для всей системы, для доступа к разделяемым библиотекам и для целей ядра системы, и локальные, по одной для каждого потока/процесса.

Они называются соответственно глобальной таблицей дескрипторов и локальной таблицей дескрипторов.

Ну вот. Итак, нам нужен «дескриптор» для кода и данных.

Всю таблицу можно найти под спойлером с отрывком 1.

Дресс-код

ядро.

asm (отрывок 1)

   

GDT:

Теги: #ОС #Ассемблер #asm #защищенный режим
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.