Практическая реализация страничной адресации
Приведенный ниже пример (по сути это участок программы -
процедура,которая предполагает, что она находится в защищенном режиме)
заполняет страницы на первые четыре мегабайта оперативной памяти и
включает страничную адресацию
global enable_paging
%define PAGE_TABLE 0x105000
enable_paging:
push ebp
mov ebp, esp
;Каталог страниц будет находиться по адресу PAGE_TABLE
mov edi, PAGE_TABLE
mov eax, PAGE_TABLE+0x1007
stosd ;Первый элемент каталога указывает на нашу таблицу страниц
;Все остальные элементы не используются:
mov ecx, 1023
xor eax, eax
rep stosd
;Каждый элемент таблицы страниц указывает на соответствующий физический адрес,
;т.е. линейный адрес совпадает с физическим:
mov eax, 0x7
mov ecx, 1024
.loop:
stosd
add eax, 0x1000
loop .loop
;Загрузка адреса каталога в регистр CR3:
mov eax, PAGE_TABLE
mov cr3, eax
;Установка бита PG:
mov eax, cr0
or eax, 0x80000000
mov cr0, eax
pop ebp
ret