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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Дисклеймер?

Хай Хабр! Это серия статей по написанию моей ОС с нуля. Я лютый фанат ретропрограммирования, поэтому я мгновенно забуду про существование EDК. Просьба не писать комменты по типу "BIOS давно устарела где UEFI?". Пишу это просто чтобы было, что почитать вечером и порелаксить. Спасибо.

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

Если вы не владеете языком ассемблера, то можете испытать сложности в понимании происходящего. Пользуюсь я ассемблером FASM

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

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

Проблемы IA-16

Ну, думаю здесь можно долгий список писать. Выделю, как по мне, самые основные: 1. ограничение адресации ОЗУ в 320Кб, 2. 0 защиты и изоляции памяти, 3. Отсутствие некоторых возможностей. Думаю, и здесь можно понять, что IA-32 лучше чем IA-16 как архитектура.

Выйди за меня, OSDev.org!

Да, да-а... Этот самый сайт для медитации в момент brainkudatoushel'. Я изучил страницы осдева, посвященные защищенному режиму вдоль и поперек, и уже начинал заталкивать в голову монитор. Через пару часов, не без помощи Макса, я все понял и начал писать.

Что такое GDT и с чем его едят

Вообще, это довольно интересная тема, требующая отдельной статьи. Опишу в кратце Спишу с википедии:

GDT (англ. Global Descriptor Table, глобальная таблица дескрипторов) — служебная структура данных в архитектуре x86, определяющая глобальные (общие для всех задач) сегменты. Её расположение в физической памяти и размер определяются системным регистром GDTR.

Дескрипторы LDT и сегментов задач (TSS) могут находиться только здесь.

Ну вот. И так, как же она выглядит в коде? Ну-у.. Пугающе с первого взгляда. Лучше быстрее перейти к коду.

Дресс-код

kernel.asm (отрывок)
GDT: dw 0
    .size dw @f-GDT-1
    .linear dd GDT
    .code = $ - GDT
        dw -1,0
        db 0,9ah,0cfh,0
    .data = $ - GDT
        dw -1,0
        db 0,92h,0cfh,0
    .pointer:
        dw GDT.size
        dd GDT
    @@:

В принципе, этот код можно взять за шаблон и использовать везде, он практически универсален.

kernel.asm (другой отрывок)
cli                     ; NO more interrupts
lgdt fword[GDT.pointer] ; Load GDT
mov eax, cr0            ; Where my CR0?
or al, 1                ; set lowest bit
mov cr0,eax             ; apply changes
jmp GDT.code:pmode     ; jump next

pmode:

use32

; I also need to set data segment

mov ax, GDT.data
mov ds, ax
; stack segment
mov ss, ax
; graphic segment
movs gs, ax

mov sp, 0xFFFF ; why not to locate stack in low RAM?

...

Здесь мы входим в защищенный режим, подгружая в GDTR указатель на GDT и настраивая сегментные регистры.

Ну вот и все! В конец можно поставить код для зависания ЦП или свой код (демку какую-нибудь, например).

Вот, например, что зделал я:

Просто слеш. скуууушно
Просто слеш. скуууушно

Спасибо за внимание!

П.Ы.: Принимаю любые предложения по развитию проекта в лс Хабра

Ссылки:

  1. HexOS-GitHub

  2. Предыдущая часть

  3. Здесь будет ссылка на следующую часть

Источник: https://habr.com/ru/post/670162/


Интересные статьи

Интересные статьи

На Хабре существует немало статей, посвящённых повышению производительности программ за счёт параллельных вычислений и использования векторных команд. Я решил дополнить этот список и рассказать о то...
Это последний пост из серии 4-х постов, посвященной заглядыванию внутрь Chrome, и исследующей, как он обрабатывает наш код для отображения веб-сайта. В предыдущем посте мы рассмотрели *ре...
В прошлый раз я рассказал о функциях балансировщика нагрузки NSX ALB, описал его архитектуру и схему работы. Мы посмотрели, как работает глобальная балансировка серверов (GSLB), которая о...
Часть 2 Часть 3 Часть фотографий была взята с сайта Hack The Moon. Статья была представлена на 27-й ежегодной конференции по навигации и управлению Американского Общества Астронавтики (AAS...
Привет, Хабр. В предыдущей части про передачу в GNU Radio был задан вопрос о том, можно ли декодировать протокол LoRa (передача данных для устройств с низким энергопотреблением) с помощью SDR....