PM - Paging
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
Для чего у тебя в коде еще такие конструкции:
mov es,ax
mov es:[00h],byte ptr "0"
Селекторы чтоли загружаешь????
Селекторы чтоли загружаешь????
Нет, вывожу на экран символ(чтобы знать до какого момента прога дошла).
Может быть много причин ошибки: ты устанавливаешь бит "страничная трансляция разрешена", когда бит защищенного режима сброшен; не обновляешь поле cr3 в TSS (это поле не является динамически обновляемым); ты устанавливаешь страничную трансляцию, когда у тебя не загружен регистр TR (точно не знаю, вызовет это ошибку или нет, т.к. я подобным извратом не занимался); происходит переключение задач, а в задаче на которую переключается не установлено поле "cr3" в TSS; не установлено равенство линейных адресов и физических (это нужно только для задачи инициализации, т.к. до этого она работала без подкачки и линейный адрес был равен физическому); неправильные значения в таблицах страниц (не установлен бит присутствия, сброшен бит разрешения записи и т.д. и т.п.) или нарушена привилегированность доступа к страницам...
А чё за "регистр TR"?
Как мне кажется надо для начала открыть A20, затем перейти в PM, а уже из PM пытаться включить страничную адресацию.
2piroman17: А вообще проверь условия, описанные Pecador'ом.
PS. А у тебя доступно без открытия A20?))
P.S. драйверов расширенной памяти не стоит или подобных фишек которые включают старшие адресные линии... У меня есть подозрение (может оно и не верное) что на новых машинах блокировка старших адресных линий не производится вообще, а было это во времена i486
xxxxxxxxxxx0xxxxxxxxxxxxxxxxxxxxb , где x = 0 или 1
При использовании страничной адресации в дескрипторах описывающих сегменты LDT и TSS адреса указаны реальные или с учётом страничной адресации? Адрес GDT указывать с учётом страничной адресации?
И ещё: какие поля TSS не загружаются автоматически (я знаю что CR3, может ещё что есть)?
Возможен ли такой механизм переключения?:
1) старая задача, старый CR3, происходит int [таймер]
1-1) проц сохраняет данные в TSS старой задачи, грузит TSS ядра, затем CR3, педаёт управление
3) задача ядра, CR3 ядра, JMP FAR [TSS-новой задачи]
3-1) проц сохраняет данные в TSS ядра, грузит TSS новой задачи, затем CR3, LDT, передаёт управление
4) работает новая задача
так написано в интеловском мануале:
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 загружается раньше всех, но не факт!
Возможен ли такой механизм переключения?:
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. В одной задаче может быть и обычный код и ядерный.
TSS не делятся на TSS ядра и на TSS не ядра, Привилегированность кода определяет регистр CS, а точнее поле RPL в регистре CS. В одной задаче может быть и обычный код и ядерный.
Под "TSS ядра" я подразумеваю TSS задачи которая переключает задачи.
piroman17, нерационально использовать отдельную задачу для переключения между задачами. Значительно эффективнее переключаться напрямую из одной задачи в другую.
piroman17, нерационально использовать отдельную задачу для переключения между задачами. Значительно эффективнее переключаться напрямую из одной задачи в другую.
Как это реализовать? В качестве обработчика прерывания таймера должен быть код на Ring0, что бы получить доступ к таблице задач и вычислить следующую (по политике безопасности моей ОС только задачи нулевого уровня могут иметь доступ к таблице задач). А как "подняться" с уровней 2 и 3 на нулевой, не используя переключения задачи?
Собственно ставим в 0 уровень привелегий в IDT в таймера. И при приходе прерывания от таймера поподаем в 0 кольцо в текущей задачи.
Собственно при таком режиме надо помниь что мы работаем в ядре с текущей задачей.