Дисклеймер?
Хай Хабр! Это серия статей по написанию моей ОС с нуля. Я лютый фанат ретропрограммирования, поэтому я мгновенно забуду про существование EDК. Просьба не писать комменты по типу "BIOS давно устарела где UEFI?". Пишу это просто чтобы было, что почитать вечером и порелаксить. Спасибо.
Давайте договоримся
Если вы не владеете языком ассемблера, то можете испытать сложности в понимании происходящего. Пользуюсь я ассемблером FASM
В прошлой части мы написали собственный загрузчик из двух стадий: ограниченой рамками MBR и без ограничений(ну, почти), которая даже имеет красивый колхозный BSOD. В этой части будем переходить в защищенный режим.

Проблемы 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 и настраивая сегментные регистры.
Ну вот и все! В конец можно поставить код для зависания ЦП или свой код (демку какую-нибудь, например).
Вот, например, что зделал я:

Спасибо за внимание!
П.Ы.: Принимаю любые предложения по развитию проекта в лс Хабра
Ссылки:
HexOS-GitHub
Предыдущая часть
Здесь будет ссылка на следующую часть
