Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Перевод процессора в защищенный режим
Форум программистов > Системное программирование > Другие
Tolstiy
Цитата
;переключаемся в защищенный режим
mov      eax,cr0
or        al,1
mov      cr0,eax
;настраиваем регистры
db        0eah      ;машинный код команды jmp
dw        offset protect      ;смещение метки перехода в сегменте команд
dw        30h      ;селектор сегмента кода в таблице GDT

protect:


После перехода в защищенный режим, нужно проинициализировать сегментный регистр CS, это можно сделать выполнив команду дальнего перехода.
Вопрос 1: Зачем указывать явно код команды дальнего перехода, т.е. записывать команду дальнего перехода как последовательность данных?

В старших моделях процессоров Intel, можно написать команду косвенного дальнего перехода jmp dword ptr Address (где в переменной Address храниться селектор сегмента кода и смещение), в старых моделях мы так делать не могли. Удалось выяснить что это как то связанно с особенностями конвейера старших поколений процессоров Intel.
Вопрос 2: Чем отличаются конвейеры младших и старших поколений Intel, что появилось нового, за счет чего стало возможным выполнить такую команду сразу после перехода в защищенный режим? и из за чего на старых процессорах нельзя было так сделать?

И буду очень рад подробной информации и работе конвейеров процессоров Intel.
Dico
]]>http://wasm.ru/doclist.php?list=1]]>


Скачай себе хоть и немало но всё там есть:
WASM.RU by WASM.RU
Оффлайновая версия сайта (статьи и прилагающиеся к ним файлы) на 31.12.2004.
+ Новый Дзайн
+ Поиск

Домашняя страница: ]]>http://www.wasm.ru/]]>
русский
Размер: 9897.27 kb
Комментариев: 16
????
Для: Tolstiy
]]>ищи сам]]> smile.gif
????
Для: Tolstiy
ну ещё и цитата из Юрова (Юров В., Хорошенко С. Assembler: учебный курс урок 16)
Цитата
Работа в защищенном режиме

Настройка сегментных регистров

Вспомним, что содержимое сегментных регистров в реальном и защищенном режимах интерпретируется микропроцессором по-разному. Как только микропроцессор оказывается в защищенном режиме, первую же коман­ду он пытается выполнить традиционно: по содержимому пары cs : ip опреде­лить ее адрес, выбрать ее и т.д. Но содержимое сs должно быть индексом, ука­зывающим на дескриптор сегмента кода в таблице GDT. Но пока это не так, так как в данный момент сs все еще содержит физический адрес параграфа сег­мента кода, как этого требуют правила формирования физического адреса в реальном режиме. То же самое происходит и с другими регистрами. Но если содержимое других сегментные регистров можно подкорректировать в програм­ме, то в случае с регистром cs этого сделать нельзя, так как он в защищенном режиме программно недоступен.

Как? - Моделировать команду межсегментного перехода.

Вспомним, что действие команд пере­хода основано как раз на изменении содержимого регистров cs и ip. Команды ближнего перехода изменяют только содержимое eip\ip, а команды дальнего пе­рехода — оба регистра cs и eip\ip. Воспользуемся этим обстоятельством, вдоба­вок существует и еще одно свойство команд передачи управления — они сбра­сывают конвейер микропроцессора, подготавливая его тем самым к приему команд, которые сформированы уже по правилам защищенного режима. Это же обстоятельство заставляет нас впрямую моделировать команду межсегментного перехода, чтобы поместить правильное значение селектора в сегментный регистр cs. Это можно сделать так:

code    segment

; . . .

db    0eah                  ; машинный код команды jmp

dw    offset protect    ; смещение метки перехода в сегменте команд

dw    30h                    ; селектор сегмента кода в таблице GDT protect:

; загрузить селекторы для остальных дескрипторов

mov  ax,18h

mov  ds,ax        ;сегментный регистр данных

mov  ax,28h

mov  ss,ax        ; сегментный регистр стека

mov  ax,20h

mov  es,ax      ; дополнительный сегмент данных для указания на видеобуфер
Guest
Цитата
ну ещё и цитата из Юрова (Юров В., Хорошенко С. Assembler: учебный курс урок 16)


Юрова я уже выучил чуть ли не на изусть, но там ответа на мой вопрос нету, я перерыл несколько десятков книг по ассемблеру и защещенному режиму, везде написано для чего мы это делаем, но нигде нету, почему именно так, и не как иначе.
Причем я написал второй способ как это можно сделать, но только в процессорах старших моделей, нигде про второй способ даже и не пишется. Не говоря уж про то, за счет чего стало возможным так делать.
Еще напоролся на инфу, что в старших моделях инициализировать регистры cs и ss вобще не обязательно, процессор будет смотреть на содержимое в теневых регистрах, и вполне нормально работать.
Dico
А официальная дока с сайта ]]>http://www.intel.com/]]> - непокатит!!!!
????
Цитата(Guest @ 8:06:2005, 11:34 )
Причем я написал второй способ как это можно сделать, но только в процессорах старших моделей, нигде про второй способ даже и не пишется.
*

Пишется. Библиотека системного программиста том 6. (2.4. Пример простой программы переключения режима):

; ------------------------------------------------------------
; Процедура переключает процессор в защищённый режим
; ------------------------------------------------------------

PROC    set_protected_mode      NEAR

       mov     ax,[rl_crt]   ; записываем в es сегментный
       mov     es,ax         ; адрес видеопамяти

       call    enable_a20    ; открываем адресную линию A20

       mov     [real_ss],ss  ; запоминаем указатель стека
       mov     [real_es],es  ; для реального режима

; Загружаем регистр GDTR

       lgdt    [QWORD gdt_gdt]

; Устанавливаем защищённый режим работы процессора

       mov     ax,VIRTUAL_MODE
       lmsw    ax

; Мы находимся в защищённом режиме

; Очищаем внутреннюю очередь команд процессора
; Выполняем команду межсегментного прерхода,
; в качестве селектора указываем селектор текущего
; сегмента кода, в качестве смещения - метку flush

;       jmp     far flush
       db      0ea
       dw      OFFSET flush
       dw      CS_DESCR

LABEL   flush   FAR

; Загружаем сегментные регистры SS и DS селекторами

       mov     ax,SS_DESCR
       mov     ss,ax
       mov     ax,DS_DESCR
       mov     ds,ax
       ret

ENDP    set_protected_mode


Как видишь, упоминание про jmp far flush есть, а обяснений я не искал.
Guest
Цитата
Как видишь, упоминание про jmp far flush есть, а обяснений я не искал.


Если ты присмотришься повнимательнее, то увидишь, что перед jmp far flush стоит знак ";", т.е. это коментарий, и тем более что это прямой дальний переход на метку flush, так компилятор никогда не примет, потому и закоментирована эта команда, и далее написан код этой команды явно. Почему? это и есть мой первый вопрос.

А второй способ, это косвенный переход, т.е. переход по адресу, который указан в соответствующей ячейке памяти. Например:
Address dd 00000030h
....
jmp dword ptr Address
Вот о таком способе я нигде не видел упоминаний.

И вобще надо прикладывать список книг которые я прочетал, чтоб не цитировали мне то, что я и так наизусть знаю, и где никакого ответа нету.

Из следующих книг прошу информацию не кидать.
Финогенов К.Г., Юров В., Зубков, Александр Фролов, Григорий Фролов, и т.д. и т.п., Вся Библиотека Системного Программиста.
remedius
Подскажите пожалйста, Я скопировала пример из Финогенова - он не работает(мало того он не компилился, было куча опечатков)...После долгого и нудного сравнения с примером Зубкова, который работает, по ходу дела у него изначально неправильно что-то, или какае-то глобальная опечатка. При запуске проги, просто раскручивается флоп и все...И такое происходит и в первом его и во втором примере. Может кто смотрел и проверял код Финогенова..Помогите пожалуйста!!!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.