use32
start:
@@:
; Очистим таблицы страниц
xor ax, ax
mov cx, 3 * 4096 / 2
mov di, 0x1000
rep stosw
; Заполним каталог страниц
mov word[0x1000], 0x2000 + 111b
mov word[0x1FFC], 0x3000 + 111b
; Заполним первую таблицу страниц
mov eax, 11b
mov cx, 0x100000 / 4096
mov di, 0x2000
@@:
stosd
add eax, 0x1000
loop @b
; Заполним последнюю таблицу страниц
mov di, 0x3000
mov eax, dword[0x6000]
or eax, 11b
mov ecx, dword[0x6008]
shr ecx, 12
@@:
stosd
add eax, 0x1000
loop @b
mov word[0x3FF4], 0x4000 + 11b ; Kernel stack
mov word[0x3FF8], 0x3000 + 11b ; Kernel page table
; Загрузим значение в CR3
mov eax, 0x1000
mov cr3, eax
; Запретим прерывания
cli
; Перейдём в защищённый режим
mov eax, cr0
or eax, 0x80000001
mov cr0, eax
mov byte[0xB8000 + (25 * 80 - 1) * 2], "K"
hlt