Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Страничная Адресация.

1.8K
10 мая 2008 года
Evgeni
188 / / 14.06.2006
Подскажите плиз, как должна организовываться страничная адресация.
Лично я думал вот так:

1) Еще в реальном режиме вычисляется адрес Каталога страниц.
2) В защищенном режиме в каталоге страниц создаю запись с адресом на Таблицу Страниц
3) В защищенном режиме создаем Таблицу страниц.
4) В Таблице Страниц создаю страницы(а вот какие адреса в них указывать?)
5) Загружаю регистр cr3
6) Выставляю флаг 31 в cr0
7) Делаю прыжок

Вот и не знаю, какие адреса писать в таблице страниц.
360
11 мая 2008 года
P*t*
474 / / 15.02.2007
Цитата: Evgeni
Подскажите плиз, как должна организовываться страничная адресация.
Лично я думал вот так:

1) Еще в реальном режиме вычисляется адрес Каталога страниц.
2) В защищенном режиме в каталоге страниц создаю запись с адресом на Таблицу Страниц
3) В защищенном режиме создаем Таблицу страниц.
4) В Таблице Страниц создаю страницы(а вот какие адреса в них указывать?)
5) Загружаю регистр cr3
6) Выставляю флаг 31 в cr0
7) Делаю прыжок

Вот и не знаю, какие адреса писать в таблице страниц.



Зачем что-то делать ещё не перейдя в защищённый режим?
Зачем вычислять адрес каталога страниц? Его можно выбрать произвольным.

Я делал так:
1) выбираю память для каталога страниц
2) выбираю память для первой таблицы страниц и заношу запись в каталог страниц
3) создаю страницы соответствующие каталогу страниц, таблице страниц и коду, выполняющемуся в данный момент, так чтобы виртуальный адрес совпадал с физическим
4) Загружаю регистр cr3 и выставляю флаг 31 в cr0
5) всё. зачем делать прыжок кудато я не понимаю - и так работает.

1.8K
11 мая 2008 года
Evgeni
188 / / 14.06.2006
Я так понимаю, ВСЕ действия делаются в защищенном режиме?
и еще: адресс начала кода равен = селектор+0000h или тот, который прописан в дескрипторе ? т.е этот адресс и заносить в запись страницы?
360
11 мая 2008 года
P*t*
474 / / 15.02.2007
Цитата: Evgeni
Я так понимаю, ВСЕ действия делаются в защищенном режиме?



Да, все действия происходят в защищённом режиме.
Их можно сделать ещё в реальном режиме, но я не вижу в этом смысла.

Цитата: Evgeni

и еще: адресс начала кода равен = селектор+0000h или тот, который прописан в дескрипторе ? т.е этот адресс и заносить в запись страницы?



Тот который в дескрипторе:
сначала адрес переводится из сегмент:смещения в 32-битный адрес, а затем, если включена страничная адресация, расчленяется на 3 части и заменяется на указанный в таблице страниц.
Нужно чтобы cs:eip указывало на тот же физический адрес что и до включения страничной адресации.

360
11 мая 2008 года
P*t*
474 / / 15.02.2007
[QUOTE=Phantom-84]
4) последний вход каталога устанавливаю на сам каталог, что последние 4 мега вирт. адресного пространства могли использоваться в качестве таблицы страниц;
[/QUOTE]
хм. Интересно. Я не догадался так сделать.
349
11 мая 2008 года
Phantom-84
656 / / 27.10.2005
Подготавливать структуры для страничной переадресации можно и вреальном, и в защищенном режиме. Более того устанавливать флаг PG можно одновременно с установкой флага PE. Селекторы, т.е. сегментную адресацию, сюда не нужно приплетать вообще, т.к. она действует поверх страничной. Прыгать тоже никуда не нужно. Дальний переход должен выполняться только в двух случаях:
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.
Если кратко, то это все.
1.8K
11 мая 2008 года
Evgeni
188 / / 14.06.2006
а можно уточнить, что такое транс-страницы? (от слова транслируемые?)
349
11 мая 2008 года
Phantom-84
656 / / 27.10.2005
В документации на процессоры они называются таблицами страниц. Я их так называю, чтобы не возникало путаницы с 4-мегабайтной таблицей страниц в моей системе. Вообще это страницы, ссылки на которые хранятся в каталоге страниц. Думаю, что из написанного мной выше это должно быть понятно.
1.8K
11 мая 2008 года
Evgeni
188 / / 14.06.2006
Код:
mov edi,0FF000h   ;--адрес каталога страниц
    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

но при этом этот код не работает. В чем возможная ошибка?
1.8K
11 мая 2008 года
Evgeni
188 / / 14.06.2006
пробовал заносить адрес таблицы страниц в 512-ую позицую в каталоге, но результат такой же - прога не работает
261
11 мая 2008 года
ahilles
1.5K / / 03.11.2005
посмотри вот это, там универсальный код для создания нужных структур в каталоге и таблице страниц.
349
12 мая 2008 года
Phantom-84
656 / / 27.10.2005
Evgeni, адреса 0FF000h и 0FE000h использовать нельзя, так как эти адреса относятся к теневой ROM. Из первого мега можно использовать адреса до 0A0000h, да и то доступность базовой памяти вплоть до этого адреса лучше проверить с помощью какой-либо функции BIOS, потому что в конце этой области могут храниться данные все той же BIOS. Кроме того, может у тебя direction-флаг выставлен. К тому же, раз ты решил попробовать мой вариант, в отличии от cr3 в последнем входе каталога нужно сохранять его адрес со страничными флагами, т.е. адрес плюс 7.
1.8K
12 мая 2008 года
Evgeni
188 / / 14.06.2006
Спасибо всем, все заработало(разместил каталог и таблицу сразу за первым мегабайтом. после включения адресации вывел символ на экран).
Однако не работает следующие:
У меня есть дескриптор у которого база указывает на видеопамять(B8000h). после включения адресации я в es загружаю селектор на видеопамять, после чего вызываю свое прерывание, однако ни чего не выводится.
Конечно предварительно включил прерывания. И т.к я делаю дождественное отображение, то почему не работает?
349
12 мая 2008 года
Phantom-84
656 / / 27.10.2005
Код покажи. Ты сам написал, что вывел символ на экран, и одновременно пишешь, что ничего не выводится. Если у тебя есть спец. сегмент с базой 0B8000h, то при выводе на экран через этот сегмент нужно использовать маленькие смещения. Еще проверь, установлены ли у тебя флажки PCD в страничных входах, описывающих видеобуфер.
1.8K
12 мая 2008 года
Evgeni
188 / / 14.06.2006
Простите, это я ступил ужасно))))). Вот этот маленький кусочек кода
Код:
mov edi,100000h    ;--адрес каталога страниц
    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.
Вот и все.
261
13 мая 2008 года
ahilles
1.5K / / 03.11.2005
так. давай сначала, где у тебя находится GDT? определил ли ты для страницы в которой находится GDT соответствующие записи в каталоге и таблице страниц?
349
14 мая 2008 года
Phantom-84
656 / / 27.10.2005
Цитата: ahilles
так. давай сначала, где у тебя находится GDT? определил ли ты для страницы в которой находится GDT соответствующие записи в каталоге и таблице страниц?

У него для первых 4 мег имеется прямое соответствие между физ. и вирт. линейными адресами. Видимо код и данные (за исключением каталога и первой таблицы страниц) включая GDT находятся в базовой памяти. К тому же слова "Вот и все" скорее всего снимают все вопросы.

261
14 мая 2008 года
ahilles
1.5K / / 03.11.2005
ладно. Evgeni, давай тогда код обработчика прерывания
1.8K
14 мая 2008 года
Evgeni
188 / / 14.06.2006
Цитата: ahilles
ладно. Evgeni, давай тогда код обработчика прерывания



А зачем вам код обработчика прерываний??))). Он туп и прост. Но если так уж надо, то вот он:

Код:
int_1:                             ;
     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, у меня все получилось.
261
15 мая 2008 года
ahilles
1.5K / / 03.11.2005
тебе надо в коде обработчика позаботиться о том чтобы edi был равен нулю, а я этого там не наблюдаю.
1.8K
15 мая 2008 года
Evgeni
188 / / 14.06.2006
я это знаю. Я же говорю, что все уже сделал. edi я задаю вручную при вызове прерывания.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог