Страничная Адресация.
Лично я думал вот так:
1) Еще в реальном режиме вычисляется адрес Каталога страниц.
2) В защищенном режиме в каталоге страниц создаю запись с адресом на Таблицу Страниц
3) В защищенном режиме создаем Таблицу страниц.
4) В Таблице Страниц создаю страницы(а вот какие адреса в них указывать?)
5) Загружаю регистр cr3
6) Выставляю флаг 31 в cr0
7) Делаю прыжок
Вот и не знаю, какие адреса писать в таблице страниц.
Лично я думал вот так:
1) Еще в реальном режиме вычисляется адрес Каталога страниц.
2) В защищенном режиме в каталоге страниц создаю запись с адресом на Таблицу Страниц
3) В защищенном режиме создаем Таблицу страниц.
4) В Таблице Страниц создаю страницы(а вот какие адреса в них указывать?)
5) Загружаю регистр cr3
6) Выставляю флаг 31 в cr0
7) Делаю прыжок
Вот и не знаю, какие адреса писать в таблице страниц.
Зачем что-то делать ещё не перейдя в защищённый режим?
Зачем вычислять адрес каталога страниц? Его можно выбрать произвольным.
Я делал так:
1) выбираю память для каталога страниц
2) выбираю память для первой таблицы страниц и заношу запись в каталог страниц
3) создаю страницы соответствующие каталогу страниц, таблице страниц и коду, выполняющемуся в данный момент, так чтобы виртуальный адрес совпадал с физическим
4) Загружаю регистр cr3 и выставляю флаг 31 в cr0
5) всё. зачем делать прыжок кудато я не понимаю - и так работает.
и еще: адресс начала кода равен = селектор+0000h или тот, который прописан в дескрипторе ? т.е этот адресс и заносить в запись страницы?
Да, все действия происходят в защищённом режиме.
Их можно сделать ещё в реальном режиме, но я не вижу в этом смысла.
и еще: адресс начала кода равен = селектор+0000h или тот, который прописан в дескрипторе ? т.е этот адресс и заносить в запись страницы?
Тот который в дескрипторе:
сначала адрес переводится из сегмент:смещения в 32-битный адрес, а затем, если включена страничная адресация, расчленяется на 3 части и заменяется на указанный в таблице страниц.
Нужно чтобы cs:eip указывало на тот же физический адрес что и до включения страничной адресации.
4) последний вход каталога устанавливаю на сам каталог, что последние 4 мега вирт. адресного пространства могли использоваться в качестве таблицы страниц;
[/QUOTE]
хм. Интересно. Я не догадался так сделать.
1) необходимо перезагрузить регистр cs;
2) необходимо актуализировать загруженный код.
Я включаю страничную переадресацию в защищенном режиме так:
1) getpage для каталога страниц;
2) первый вход каталога устанавливаю на транс-страницу, находящуюся в пределах базовой памяти и описывающую первые 640 Кб физ. адресного пространства (это временная страница, которая будет потов высвобождена вместе со всей базовой памятью);
3) 1022 входа каталога обнуляю;
4) последний вход каталога устанавливаю на сам каталог, чтобы последние 4 мега вирт. адресного пространства могли использоваться в качестве таблицы страниц;
5) getpage в цикле для транс-страниц ядра (если ядро занимает менее 4 мег, то достаточно одной такой страницы);
6) заношу ссылки на эти транс-страницы в каталог в позиции, зависящие от базы ядра (для ядра с базой 0x80000000 начиная с 512-го входа каталога);
7) после этих страниц прикрепляю транс-страницу FPT (Free Page Table), находящуюся в базовой памяти и сформированную ранее для описания всей присутствующей памяти;
8) загружаю адрес каталога в cr3 и устанавливаю бит PG.
Если кратко, то это все.
mov eax,0FE007h ;--адрес таблицы страниц
stosd
mov ecx,1022
xor eax,eax
rep stosd
mov eax,0FF000h
stosd
mov edi,0FE000h ;--адрес таблицы страниц
mov eax,7h
mov ecx,1024
page_1:
stosd
add eax,1000h
loop page_1
mov eax,0FF000h
mov cr3,eax
mov eax,cr0
bts eax,31
mov cr0,eax
но при этом этот код не работает. В чем возможная ошибка?
Однако не работает следующие:
У меня есть дескриптор у которого база указывает на видеопамять(B8000h). после включения адресации я в es загружаю селектор на видеопамять, после чего вызываю свое прерывание, однако ни чего не выводится.
Конечно предварительно включил прерывания. И т.к я делаю дождественное отображение, то почему не работает?
mov eax,101007h ;--адрес таблицы страниц
stosd
xor eax,eax
mov ecx,1022
rep stosd
mov eax,100007h
stosd
mov eax,7h
mov ecx,1024
page_1:
stosd
add eax,1000h
loop page_1
mov eax,100000h
mov cr3,eax
mov eax,cr0
bts eax,31
mov cr0,eax
mov eax,video_selector
mov es,ax
Здесь у меня вначале es указывал на дискриптор с базой в нуле, а потом я его загрузил селектором, указывающим на видео-дескриптор с базой B8000h.
Вот и все.
У него для первых 4 мег имеется прямое соответствие между физ. и вирт. линейными адресами. Видимо код и данные (за исключением каталога и первой таблицы страниц) включая GDT находятся в базовой памяти. К тому же слова "Вот и все" скорее всего снимают все вопросы.
А зачем вам код обработчика прерываний??))). Он туп и прост. Но если так уж надо, то вот он:
pushad ;
cmp al,01h ;
je @chislo
cld
@str: ;
mov al,[ds:esi] ;
cmp al,0h ;
je @exit ;
stosw ;
inc si ;
jmp @str ;
@exit:
popad
ret ;
@chislo:
mov eax,edx
xor edx,edx
xor ecx,ecx
@chislo_cikl:
mov ebx,10
idiv ebx
push dx
xor edx,edx
inc ecx
cmp eax,0h
jne @chislo_cikl
@chislo_vivod:
pop dx
mov dh,0Fh
add dl,30h
mov [es:edi],dx
inc edi
inc edi
loop @chislo_vivod
popad ;
ret ;
;-----------------------------------
здесь у меня вывод сообщения на экран есть и вывод 32-битного числа.
Но, как верно подметил Phantom-84, у меня все получилось.