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

Ваш аккаунт

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

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

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

PM - Paging

1.2K
03 октября 2006 года
piroman17
175 / / 20.07.2006
Народ, плиз помогите! Проц не хочет включать страничное представление памяти. Вот исходник в общем виде:

Код:
kernel proc
sti

mov ax,100000b
mov es,ax
mov es:[00h],byte ptr "0"

mov ax,111000b
mov ss,ax
mov esp,30

mov ax,100000b
mov es,ax
mov es:[00h],byte ptr "1"

;INITING PAGES TABLE
call set_pages_Real    ;53 Mb
;call set_pages_Real1   ;53+53=106 Mb

mov ax,100000b
mov es,ax
mov es:[00h],byte ptr "2"




;Здесь и происходит RESET

mov  [COLOR="Blue"]eax[/COLOR],[COLOR="#0000ff"]cr0[/COLOR]
or  [COLOR="Blue"]eax[/COLOR], [COLOR="Green"]10000000000000000000000000000000b[/COLOR]  ; Устанавливаем 31-й
mov  [COLOR="#0000ff"]cr0[/COLOR],[COLOR="#0000ff"]eax[/COLOR]


mov ax,100000b
mov es,ax
mov es:[00h],byte ptr "3"

...

kernel endp
20K
03 октября 2006 года
Pecador
10 / / 01.10.2006
Ты загрузил перед включением страничной трансляции регистр cr3????
1.2K
03 октября 2006 года
piroman17
175 / / 20.07.2006
Да, ещё в RealMode...
1.2K
04 октября 2006 года
piroman17
175 / / 20.07.2006
Да, ещё в RealMode...
20K
04 октября 2006 года
Pecador
10 / / 01.10.2006
Может быть много причин ошибки: ты устанавливаешь бит "страничная трансляция разрешена", когда бит защищенного режима сброшен; не обновляешь поле cr3 в TSS (это поле не является динамически обновляемым); ты устанавливаешь страничную трансляцию, когда у тебя не загружен регистр TR (точно не знаю, вызовет это ошибку или нет, т.к. я подобным извратом не занимался); происходит переключение задач, а в задаче на которую переключается не установлено поле "cr3" в TSS; не установлено равенство линейных адресов и физических (это нужно только для задачи инициализации, т.к. до этого она работала без подкачки и линейный адрес был равен физическому); неправильные значения в таблицах страниц (не установлен бит присутствия, сброшен бит разрешения записи и т.д. и т.п.) или нарушена привилегированность доступа к страницам...
Для чего у тебя в коде еще такие конструкции:
 
Код:
mov ax,100000b
mov es,ax
mov es:[00h],byte ptr "0"

Селекторы чтоли загружаешь????
1.2K
04 октября 2006 года
piroman17
175 / / 20.07.2006
Цитата:

Селекторы чтоли загружаешь????



Нет, вывожу на экран символ(чтобы знать до какого момента прога дошла).

Цитата:

Может быть много причин ошибки: ты устанавливаешь бит "страничная трансляция разрешена", когда бит защищенного режима сброшен; не обновляешь поле cr3 в TSS (это поле не является динамически обновляемым); ты устанавливаешь страничную трансляцию, когда у тебя не загружен регистр TR (точно не знаю, вызовет это ошибку или нет, т.к. я подобным извратом не занимался); происходит переключение задач, а в задаче на которую переключается не установлено поле "cr3" в TSS; не установлено равенство линейных адресов и физических (это нужно только для задачи инициализации, т.к. до этого она работала без подкачки и линейный адрес был равен физическому); неправильные значения в таблицах страниц (не установлен бит присутствия, сброшен бит разрешения записи и т.д. и т.п.) или нарушена привилегированность доступа к страницам...



А чё за "регистр TR"?

13K
04 октября 2006 года
Exs42
42 / / 04.09.2006
Ну TR - это 10-байтовый регистр, в котором содержатся 16-битный селектор для GDT и весь 8-байтный дескриптор из GDT, описывающий TSS текущей задачи.
Как мне кажется надо для начала открыть A20, затем перейти в PM, а уже из PM пытаться включить страничную адресацию.
334
04 октября 2006 года
HexEdit
809 / / 27.07.2006
Ну так он из PM и делает.

2piroman17: А вообще проверь условия, описанные Pecador'ом.
20K
05 октября 2006 года
Pecador
10 / / 01.10.2006
Я вот не понимаю зачем открывать A20???? Все равно после переключения в PM все адресное пространство открыто для использования, а в реал моде того что есть хватит...
20K
05 октября 2006 года
Pecador
10 / / 01.10.2006
Piroman17, я тебе интересную книжку на мыло скинул. Она про ОС, но там еще есть, хоть и немного, инфы про PM
334
05 октября 2006 года
HexEdit
809 / / 27.07.2006
Адресное пространство да, а физическая память?
PS. А у тебя доступно без открытия A20?))
349
05 октября 2006 года
Phantom-84
656 / / 27.10.2005
[QUOTE=Pecador]Я вот не понимаю зачем открывать A20???? Все равно после переключения в PM все адресное пространство открыто для использования, а в реал моде того что есть хватит...[/QUOTE]Сказки...
20K
05 октября 2006 года
Pecador
10 / / 01.10.2006
Может и сказки, видать у меня машина долбанутая (целых две долбанутых) после перехода в PM без спец. включения A20 дает доступ по всем физическим адресам...
P.S. драйверов расширенной памяти не стоит или подобных фишек которые включают старшие адресные линии... У меня есть подозрение (может оно и не верное) что на новых машинах блокировка старших адресных линий не производится вообще, а было это во времена i486
20K
05 октября 2006 года
Pecador
10 / / 01.10.2006
Блин... странно... вы говорите что старшие адресные линии в современных ПК блокируются, я только что провел небольшой опыт... написал загрузчик для дискеты и запихнул в него небольшой код включающий PM, svga режим 115h и пишуший в видеобуфер (у меня он оказался по адресу E0000000h) судя по тому что точка высветилась страшие адресные линии включены... Это что, только на моих компах такой глюк наблюдается???????
349
05 октября 2006 года
Phantom-84
656 / / 27.10.2005
Закрытая линия A20 не запрещает доступ к физ. памяти выше первого мега, а просто не позволяет обратиться к каждому второму мегу, т.е. например ты будешь писать во второй мегабайт, а запишешь в первый, будешь писать в четвертый, а запишешь в третий, ну и.т.п. Будешь обновлять все изображение на экране, а обновишь только, например, половину...
20K
05 октября 2006 года
Pecador
10 / / 01.10.2006
Да уж... я этого не знал...
334
06 октября 2006 года
HexEdit
809 / / 27.07.2006
Тоесть адресная линия A20 открывает доступ к четным мегабайтам памяти?
8.5K
06 октября 2006 года
infernodiablo
73 / / 04.03.2006
Получается физический адрес с закрытой A20 выглядит так:
xxxxxxxxxxx0xxxxxxxxxxxxxxxxxxxxb , где x = 0 или 1
1.2K
03 марта 2008 года
piroman17
175 / / 20.07.2006
Вот такие вопросы возникли:
При использовании страничной адресации в дескрипторах описывающих сегменты LDT и TSS адреса указаны реальные или с учётом страничной адресации? Адрес GDT указывать с учётом страничной адресации?
И ещё: какие поля TSS не загружаются автоматически (я знаю что CR3, может ещё что есть)?
349
03 марта 2008 года
Phantom-84
656 / / 27.10.2005
Адреса линейные. Т.е. если включена страничная переадресация, то не физические, а полученные с учетом страничной переадресации. Адреса GDT, IDT также линейные. Автоматически загружаются данные из всех регистровых полей TSS кроме ss0, esp0, ss1, esp1, ss2, esp2. CR3 загружается автоматически!!!
1.2K
04 марта 2008 года
piroman17
175 / / 20.07.2006
А что раньше загружается CR3 или LDT?

Возможен ли такой механизм переключения?:
1) старая задача, старый CR3, происходит int [таймер]
1-1) проц сохраняет данные в TSS старой задачи, грузит TSS ядра, затем CR3, педаёт управление
3) задача ядра, CR3 ядра, JMP FAR [TSS-новой задачи]
3-1) проц сохраняет данные в TSS ядра, грузит TSS новой задачи, затем CR3, LDT, передаёт управление
4) работает новая задача
261
04 марта 2008 года
ahilles
1.5K / / 03.11.2005
Цитата: piroman17
А что раньше загружается CR3 или LDT?


так написано в интеловском мануале:

Цитата:
12. The TSS state is loaded into the processor. This includes the LDTR register, the
PDBR (control register CR3), the EFLAGS registers, the EIP register, the generalpurpose
registers, and the segment selectors. Note that a fault during the load of
this state may corrupt architectural state.


получается что регистр LDTR загружается раньше всех, но не факт!

Цитата: piroman17

Возможен ли такой механизм переключения?:
1) старая задача, старый CR3, происходит int [таймер]
1-1) проц сохраняет данные в TSS старой задачи, грузит TSS ядра, затем CR3, педаёт управление
3) задача ядра, CR3 ядра, JMP FAR [TSS-новой задачи]
3-1) проц сохраняет данные в TSS ядра, грузит TSS новой задачи, затем CR3, LDT, передаёт управление
4) работает новая задача


TSS не делятся на TSS ядра и на TSS не ядра, Привилегированность кода определяет регистр CS, а точнее поле RPL в регистре CS. В одной задаче может быть и обычный код и ядерный.

1.2K
04 марта 2008 года
piroman17
175 / / 20.07.2006
Цитата: ahilles

TSS не делятся на TSS ядра и на TSS не ядра, Привилегированность кода определяет регистр CS, а точнее поле RPL в регистре CS. В одной задаче может быть и обычный код и ядерный.


Под "TSS ядра" я подразумеваю TSS задачи которая переключает задачи.

349
05 марта 2008 года
Phantom-84
656 / / 27.10.2005
CR3 скорее всего загружается раньше, чем LDTR, хотя для нормальной системы это должно быть не важно, потому что LDTR фактически загружается из GDT, которая должна быть глобальной, т.е. отображаемой во все вирт. адресные пространства по одному и тому же адресу, а селекторная часть LDTR выбирается из самого активируемого TSS, который также должен быть доступен на момент переключения, впрочем как и деактивируемый TSS.

piroman17, нерационально использовать отдельную задачу для переключения между задачами. Значительно эффективнее переключаться напрямую из одной задачи в другую.
1.2K
06 марта 2008 года
piroman17
175 / / 20.07.2006
Цитата: Phantom-84

piroman17, нерационально использовать отдельную задачу для переключения между задачами. Значительно эффективнее переключаться напрямую из одной задачи в другую.



Как это реализовать? В качестве обработчика прерывания таймера должен быть код на Ring0, что бы получить доступ к таблице задач и вычислить следующую (по политике безопасности моей ОС только задачи нулевого уровня могут иметь доступ к таблице задач). А как "подняться" с уровней 2 и 3 на нулевой, не используя переключения задачи?

551
07 марта 2008 года
Pavia
357 / / 22.04.2004
При вызове прерывания, прыжке на вентиль(шлюз) и вызово на вентиля(шлюза) происходит переключения уровня привелегий( если DPL<CPL). На тот который записан в RPL. Часть прерываний помещаем на 0 уровень часть на другии.
Собственно ставим в 0 уровень привелегий в IDT в таймера. И при приходе прерывания от таймера поподаем в 0 кольцо в текущей задачи.

Собственно при таком режиме надо помниь что мы работаем в ядре с текущей задачей.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог