;****Memory MAP****
;050000h GDT
;060000h PDE
;061000h PTE
;070000h Этот код
;****GDT****
;0 descr - null descriptor
;8 descr - Code Descriptor
;16 descr - Data Descriptor
;24 descr - Video Memory
org 070000h
use32
;Заполним таблицы PDE и PTE и перейдем к страничной адресации памяти
start:
mov ax,16
mov es,ax
mov edi,060000h
;es:edi указывают на PDE
mov EAX,006107h
stosd
mov edi,061000h
mov EAX,00000007h ; первая запись - адрес нулевой страницы равен 0
mov ECX,1024 ; кол-во страниц в таблице
fill_page_table:
stosd ; запишем первый элемент
add EAX,1000h ; добавим 4 Кб
loop fill_page_table ; и повторим для всех элементов таблицы страниц
mov EAX,060000h ; базовый адрес
mov CR3,EAX ; в CR3 его! (база каталога страниц ВСЕГДА должна лежать в CR3)
mov EAX,CR0
or EAX,80000000h
mov CR0,EAX
; а теперь изменить физический адрес страницы 12000h на 0B8000h
mov EAX,000B80007h
mov [ES:00006100h+012h*4],dword EAX
mov EDI,0120A0h ; 12000h (уже можешь считать, что это 0B8000h) + A0h
mov ax,0101h
@@:
stosw
inc edi
inc al
inc ah
jmp @b
Страничная адресация
Код:
Из статьи:
младшие 12 бит для АДРЕСА таблицы страниц ВСЕГДА РАВНЫ нулю
а у меня было 8 бит
mov EAX,006107h поменял на mov EAX,0061007h
и mov [ES:00006100h+012h*4],dword EAX на mov [ES:000061000h+012h*4],dword EAX