Перевод процессора в защищенный режим

  • Автор темы Tolstiy
  • Дата начала
Статус
Закрыто для дальнейших ответов.
T

Tolstiy

#1
;переключаемся в защищенный режим
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.
 
D

Dico

#2
http://wasm.ru/doclist.php?list=1


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

Домашняя страница: http://www.wasm.ru/
русский
Размер: 9897.27 kb
Комментариев: 16
 
?

????

#4
Для: 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 ; дополнительный сегмент данных для указания на видеобуфер
 
G

Guest

#5
ну ещё и цитата из Юрова (Юров В., Хорошенко С. Assembler: учебный курс урок 16)
Юрова я уже выучил чуть ли не на изусть, но там ответа на мой вопрос нету, я перерыл несколько десятков книг по ассемблеру и защещенному режиму, везде написано для чего мы это делаем, но нигде нету, почему именно так, и не как иначе.
Причем я написал второй способ как это можно сделать, но только в процессорах старших моделей, нигде про второй способ даже и не пишется. Не говоря уж про то, за счет чего стало возможным так делать.
Еще напоролся на инфу, что в старших моделях инициализировать регистры cs и ss вобще не обязательно, процессор будет смотреть на содержимое в теневых регистрах, и вполне нормально работать.
 
?

????

#7
<!--QuoteBegin-Guest+8:06:2005, 11:34 -->
<span class="vbquote">(Guest @ 8:06:2005, 11:34 )</span><!--QuoteEBegin-->Причем я написал второй способ как это можно сделать, но только в процессорах старших моделей, нигде про второй способ даже и не пишется.
[snapback]20770" rel="nofollow" target="_blank[/snapback]​
[/quote]
Пишется. Библиотека системного программиста том 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 есть, а обяснений я не искал.
 

Вложения

G

Guest

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

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

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

Из следующих книг прошу информацию не кидать.
Финогенов К.Г., Юров В., Зубков, Александр Фролов, Григорий Фролов, и т.д. и т.п., Вся Библиотека Системного Программиста.
 
R

remedius

#9
Подскажите пожалйста, Я скопировала пример из Финогенова - он не работает(мало того он не компилился, было куча опечатков)...После долгого и нудного сравнения с примером Зубкова, который работает, по ходу дела у него изначально неправильно что-то, или какае-то глобальная опечатка. При запуске проги, просто раскручивается флоп и все...И такое происходит и в первом его и во втором примере. Может кто смотрел и проверял код Финогенова..Помогите пожалуйста!!!
 
Статус
Закрыто для дальнейших ответов.