Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: Процессор в защищенном режиме  (Прочитано 54348 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #30 : 06-10-2008 10:47 » 

В тексте заявляешь, что сегменты 16, а адресацию и регистры используешь 32 - тогда будет код с префиксами.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Ionn
Участник

ru
Offline Offline

« Ответ #31 : 06-10-2008 19:07 » 

Допустим процессор в рельном режиме, в скрытой части сегментного дескриптора установлен бит d
Что будет использоватья для адрессации инструкции , ip или EIP ?
Или например если я сделаю far jmp в защищенном 16 битном режиме(бит d сброшен в скрытой части) что будет использоваться eip или ip ?

для последнего примера дальний jmp необязательно..просто что будет использоваться в качестве регистра смещения команды для всех возможный режимов.?

sss, мне понятно что бит d скрытой части сегментного регистра только для процессора.именно им определяется как интерпретируется команда, если префикс есть то то вопреки  биту..меня интересует..формирование адресса инустркции...база+ значение либо из ip либо из eip, использование ip или\и eip зависит от бита d ? например я создал сегмент с базой ноль-и лимитом 4г, бит d сбросил..следовательно сегмент 16 битный..к базе в cs будет прибавляться ip или eip?

или eip\ip жестко зависит от режима-если pm- eip , если rm- ip.?

ну а  v 86 тогда как?

Склеил 5 постов. Пиши сразу всю мысль, не дроби по постам
« Последнее редактирование: 06-10-2008 19:26 от Finch » Записан
sss
Специалист

ru
Offline Offline

« Ответ #32 : 07-10-2008 01:09 » 

Цитата
Допустим процессор в рельном режиме, в скрытой части сегментного дескриптора установлен бит d
Что будет использоватья для адрессации инструкции , ip или EIP ?

Зависит только от того, как скомпилирован код. Всегда зависит только от того как скомпилирован код. Бит D не управляет режимом декодирования команд.
Записан

while (8==8)
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #33 : 07-10-2008 05:14 » 

Допустим процессор в рельном режиме, в скрытой части сегментного дескриптора установлен бит d
Что будет использоватья для адрессации инструкции , ip или EIP ?
Ionn, не морочь голову ни себе ни людям. В реальном режиме работы процессора тебе доступна только сегментная модель памяти и сегментные регистры процессора содержат базовый адрес сегмента.
Никаких скрытых и тайных частей сегментного дескриптора нет. В реальном режиме, процессор вообще не использует дескрипторы.

Насчет 32-разрядного кода в реальном режиме работы, он выполняется без проблем, и тебе никто не запрещает использовать 32-разрядный код, главное чтобы процесоор был 32-разрядным, Ты так же можешь использовать команды из MMX расширения процессора и они все будут работать. Только надо всегда помнить, что для косвенной адресации Тебе доступно только 64 КБайт памяти.
« Последнее редактирование: 07-10-2008 06:20 от Serg79 » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #34 : 07-10-2008 06:26 » 

Serg79, а документация Intel говорит об обратном: теневая часть дескриптора всегда присутствует.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #35 : 07-10-2008 06:34 » 

RXL, и Ты туда же. Это написано для того что бы потчеркнуть, что обращение к дескриптору происходит очень быстро и не надо его загружать из памяти при каждой команде процессора. Заметь те что там не сказано, что можно получить значение теневого дескриптора.
« Последнее редактирование: 07-10-2008 06:46 от Serg79 » Записан
Ionn
Участник

ru
Offline Offline

« Ответ #36 : 07-10-2008 06:46 » 

Serg79, Уж нисочтите за рекламу, вот откуда у меня все эти непонятки
http://sizov.boom.ru/segment.htm


sss, тоесть если я сгенерирую одну (32 битную) команду то проецессор использует eip
тут же следом за ним допустим идет 16 битная команда--> обрежется до ip?
я не хочу никому  морочить голову.
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #37 : 07-10-2008 06:54 » 

sss, тоесть если я сгенерирую одну (32 битную) команду то проецессор использует eip
тут же следом за ним допустим идет 16 битная команда--> обрежется до ip?
я не хочу никому  морочить голову.
Ionn, Ты прежде чем что то писать подумай.

Регистр eip/ip указывает на смещение очередной команды относительно сегментного регистра cs, повторю еще раз, указывает на смещение очередной команды относительно сегментного регистра CS, а теперь самое главное, команда находящаяся в памяти по адресу CS:IP может быть как 16-разрядной так и 32-разрядной, как командой сопроцессора, так и командой из MMX-расширения.

Так же замечу, что регистр eip/ip ни коим образом не зависит от той команды микропроцессора на которую он указывает.
« Последнее редактирование: 07-10-2008 07:07 от Serg79 » Записан
Ionn
Участник

ru
Offline Offline

« Ответ #38 : 07-10-2008 07:08 » 

я ответил так как это следовало из ответа, sss, на мой пост.
eip\ip содержит смещение относительно базы сегмента.(сегменты есть везде- и в PM и в RM)


"оманда находящаяся в памяти по адресу CS:IP может быть как 16-разрядной так и 32-разрядной"-В этом вы абсолютно правы.НО меня интересует от чего зависит использование процессорм расширенного ip , а не адрессация данных.(хотя например команды управления адрессуют данные и изменяют ip....вопрос так стоит ВСГДА ЛИ (32 битная команда) far jmp 01011h:010111213h скопирует  010111213h только в eip и выполнит инструкцию по этому смещению внутри сегмента, это будет всегда так?для всех режимов ?

немного ошибся)))) 010111213h не скопируется в eip а Сложится c текущим числом в eip .(или оно обрежится и сложится с ip?

Кажется мне стало ясно.Использование eip или ip в командах передачи управления определяется исключительно тем как выглядит эта самая команда!если 32 бита на адресс куда передается управление то эти 32 бита полностью скопируются(сложатся, в зависимости от команды) в\с eip(32 битный) НО при формировании адресса возникнет исключение защиты.(если сформированные адресс не будет соответствовать лимиту сегмента или закрыты адрессные линии.

отсюда следует что в реальном режиме используется eip старшее слово которого обнулено.

извините что снова дроблю...опять поправляюсь- Использование eip или ip в командах передачи управления определяется исключительно тем как интерпритируется эта команд процессором...тоесть с учетом бита D  и префиксов.

фактически всегда сущетвует только один eip, но в зависимости от интерпретации число(адресс), полученные после этой самой интерпретации будет либо 16 либо 32 битным..и соответственно скопируется либо в ip либо в eip

« Последнее редактирование: 07-10-2008 08:48 от Джон » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #39 : 07-10-2008 08:50 » 

Ionn, может всё-таки сначала думать, а потом словоизлиянием заниматься?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #40 : 07-10-2008 08:50 » 

извините что снова дроблю...опять поправляюсь- Использование eip или ip в командах передачи управления определяется исключительно тем как интерпритируется эта команд процессором...тоесть с учетом бита D  и префиксов.
Мы пошли по второму кругу Улыбаюсь

Цитата
Тот, кто учится не размышляя, впадет в заблуждение. Тот, кто размышляет, не желая учится, окажется в затруднении.
Конфуций
Записан
Ionn
Участник

ru
Offline Offline

« Ответ #41 : 09-10-2008 14:02 » 

Вот лишний повод впасть в заблуждение
Код:
; simpinit.asm
; Пример кода инициализации для простой плоской (линейной) модели
;
; ***************************************************************
;
; Версия 2.0
; Авторские права Intel Corp., 1988
; Данный  шаблон  должен  помочь  вам  при  разработке  прикладных/
; системных программных средств с использованием микропроцессоров
; семейства Intel i486 (TM) или Intel386(TM). Intel дает вам
; разрешение на любые   модификации   и   использование   данных
; шаблонов по необходимости.
;
***************************************************************
;
; Это  пример  кода  инициализации,  который  переводит процессоры
; i486, 386 DX, 386 SX или 376 в режим плоской модели адресации.
; Вся память рассматривается как простая линейная область RAM.
; Подпрограмм прерывания нет. Построитель создает алиас GDT и
; алиас IDT и помещает их по умолчанию в GDT[1] и GDT[2].
; После входа в защищенный режим данный код выполняет переход к
; подпрограмме начальных действий для прикладной программы на Си.
; Вы  можете  изменить  адрес  перехода  (команды  JMP) на   ваш
; собственный код или сделать в вашем коде метку C_STARTUP.

NAME simpstart           ; имя объектного модуля
EXTERN c_startup:near    ; это метка перехода после init_code

pe_flag     equ 1        ; для установки бита PE
data_selc   equ 20H      ; смещение _phantom_data_ в GDT (GDT[4])
CODEMACRO   opprefx      ; макрос для изменения размера операнда
            db 66H       ; по умолчанию
EMDM

init_code   SEGMENT ER PUBLIC
; GDT_DESC это общее символическое имя,  на которое имеется ссылка
; в файле, создаваемом построителем. Определение LOCATION в разделе
; TABLE файла построителя указывает на данную метку; построитель
; хранит и базу, и границу для указанной таблицы в этой позиции
; оперативной памяти.

PUBLIC      gdt_desc
gdt_desc    dp ?
; START   это   метка,   указывающая  на  истинное  начало  нашего
; исполняемого кода. Управление самозагрузкой BOOTSTRAP заставляет
; построитель поместить в вектор сброса компонента короткий переход
; к названной метке (в данном случае, START).
PUBLIC      start
; Поскольку этот код инициализиует процессоры i486, 386 DX, 386 SX
; или 376 в защищенный режим,  то первые команды в START проверяют
; тип компонента.  Процессоры i486,  либо 386 DX или  386  SX  при
; сбросе в реальном режиме или режиме совместимости: бит PE очищен,
; а  бит  D  для  CS  не  установлен.  Команды  выполняются  в  их
; 16-битовой форме.  Процессор 376 при сбросе имеет установленный
; бит PE и бит D,  поэтому команды  выполняются  в  их  32-битовой
; форме.
    nop                   ; Команды NOP для инициализации процессо-
    nop                   ; ров i486 или 386 DS или SX
start:
    cld                   ; Очистить флаг направления
    smsw bx               ; Проверить тип процессора при сбросе
    test bl,1             ; для скорости использовать SMSW, а не
    inz pestart           ; MOV

; Загрузка GDTR в REALSTART или PESTART зависит от того, возвращает
; ли аппаратное обеспечение пользователя READY при попытке записи
; в ПЗУ
realstart:                ; Это процессор i486 или 386 DX или
    opprefx               ; 386 SX в 16-битовом реальном режиме,
    mov eax,offset gdt_desc  ; Для получения 32-битового адреса
                          ; указателя GDT используйте префикс
                          ; операнда
    opprefx               ; Для получения адреса относительно
    and eax,0ffffh        ; области сброса используйте префикс
                          ; операнда
    lgdtw cs:[eax]        ; Загрузка в GDTR 24 битов базы

    mov ax,bx             ; Копирование слова состояния машины
    or al,pe_flag         ; Установка бита PE
    lmsw ax               ; Загрузка слова состояния машины при
                          ; установленном бите PE
    jmp next              ; Очистка очереди выборки команд

pestart:                  ; Это процессор 376 в 32-битовом защищен-
                          ; ном режиме
mode
    mov eax,offset gdt_desc  ; Получение 32-битового адреса
                          ; указателя GDT
    and eax,0ffffh        ; Получение адреса относительно области
                          ; сброса
    lgdt cs:[eax]         ; Загрузка 32 битов базы в GDTR
next:
    xor eax,eax           ; Инициализация селекторов данных
    mov al,data_selc      ; GDT[4] это _phantom_data_
    mov ds,ax
    mov ss,ax
    mov es,ax
    mov fs,ax
    mov gs,ax
    test bl,1
    jnz pejump
    opprefx               ; Используйте префикс операнда для
pejump:                   ; перехода к процессору i486, либо
                          ; 386 DX или 386 SX
    jmp far ptr c_startup ; Первый дальний переход переводит A31-20
                          ; в низкое состояние
init_code ENDS
END

из этого примера я правильно понимаю что существуют процессоры после подачи ресет находятся в защищенном режиме 32 битной адрессации?

Вот какое у меня сложилось мнение..может оно ошибочно, но использовать буду только его, ибо другого не нашел.

все ниже для сегментной организации памяти


- реальный и защищенный режим это одно и тоже, разница состоит в ослаблении защиты, разных размеров сегментов и соотвественно используемых смещения(ведь наверно нерационально будет для адрессации 64 кб использовать 32 бита?)


-память представляет собой сегменты(их количество определяет модель памяти_
-адресс каждого байта представляет собой смещение относительно базы сегмента
-полученный адресс байта в сегменте всегда 32 битен(линейный)
-полученный при любых режимах 32 битный линейный адресс накладывается на физический

-адресс получается сложение адресса базы со смещением(адресс базы хранится в скрытой части сегментного регистра)

-одна и таже команда может интерпретироваться процессором по разному(разность заключается в разрядности операндов, и адресса)

-процессор определяет как декодировать команду в соответствии с битом D, этот бит находится в скрытой части сегментного регистра и при старте компьютера может быть сброшен или нет(зависит от модели процессора)

-процессор изменит интерпретацию для одной команды, если перед ней будет префикс изменения разрядности операнда или адресса

-бит D устанавливается в скрытой части сегментного регистра при загрузке селектора на дескриптор(в дескрипторе установлен или сброшен битD)

-установленный бит D в cs  означает что код будет интерпретироваться процессором как чистый 32 битный код(это означает 32 бита адресса и 8 бит операнд для всех команд работы
с данными использующие явные или неявные операнды в команде, а также команд передачи управления)

-для любых команд справедлив бит D и префиксы , меняющие на время выполнения мировозренние процессора.(процессор затуманен битом D)

-бит D содержится в двух сегментных регистрах- данных и стека.
-для сегмента стека установленный бит d означает что для адрессации данных в стеке будет использоваться 32 битные смещения,  независимо от бита D в cs!(будет использоваться esp полностью) тоесть если бит d будет установлен в cs, а процессор встретит команду push ax при сброшенном бите d в скрытой части ss то будет использован sp -по смещению равным сумме адресса базы сегмента ss и смещения из sp


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

-управление режимами реальный\защищенный(установка бита PE) означает измение работы блока управления скрытыми частями сегментных регистров
а также включение механизма защиты сегментов(защита от записи..присутсвие на диске и прочее, что и является сущностью защищенного режима)

-в реальном режиме также как и в защищенном(бит PE) при получении адресса байта больше чем лимит в скрытой части при открытой линии старших адрессов приводит к иключению общей защиты GP =-13h(из-за отсутствия обработчика система падает)При включенной адрессных линий исключения защиты не происходит, а происходит заворот адресса.

-основная идея защищенного режима -это защита сегментов,а не новые виды организации памяти(естественно все это при сегментации)

-при сброшенном бите PE невозможно изменение базы сегмента, предела сегмента, бита D

-при установке бита PE возможно изменение всех частей скрытого сегментного регистра, путем загрузки сегментных регистров

-адресс байта это либо адресс байта начала инструкции ..либо адресс начала операнда(байта данных)


-адресс байтов данных, которые обрабатывают инструции процессора получается сложением базы, взятой из скрытой части сегментного региста DS со смещение , полученным после интерпретации.

-в современных 32 разрядных процессорах для нахождения смещения команды существует регистр eip, младшие два байта называются ip (регистр ip умер вместе с 086 процессором)

-адресс инструкции процессора получается сложением базы, взятой из cs cо смещением из eip.
-eip изменяется командами передачи управления.

при передаче управления между сегментами, с разной разрядностью и лимитами(при установленном бите PE) нужно обращать внимание на порядок в котором происходит передача управления
-например процессор учел бит D и префиксы пришел к выводу что команда- это прыжок с 16 битным числом в качестве смещения и числом 8 в качестве селектора - jmp 08h:01112h
число 1112h прибавляется к eip, теперь он содержит смещение
число 8 выбирает 1 дескриптор в gdt и загружает в скрытую часть базу..лимит..бит d(если установлен, он будет использоваться при следующих командах..смещение прыжка уже подсчитано ранее)
к базе, вновь обявленной в скрытой части прибавляется содержимое eip
передача управления.
здесь не затронуты привелегии.

Для возврата в реальный режим(тоесть для прыжка в сегмент лимитом в 64 кб)нужно такое смещение jmp cs:? в котором будет использовано не более 20 бит.как правило везде примеры работают в одном участке линейного пространства, не превышающим 64 кб.  и потому больше 20 бит для смещения не используется.

только не надо расстреливать за такой еретизм.нефига не знаю..потому и затеял всю эту кашу.
« Последнее редактирование: 10-10-2008 03:36 от Алексей1153++ » Записан
Ionn
Участник

ru
Offline Offline

« Ответ #42 : 09-10-2008 14:11 » 

опять блин не заметил что написал-
-при сброшенном бите PE возможно изменение только базы сегмента, число скопированное с сегментный регистр умножится на 016h и запишется в базу.
-бит D в cs не влияет на использование esp\sp , на него влияет только бит d в ss
Записан
Basurman
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #43 : 10-10-2008 07:54 » new

Ionn, когда человек совсем не задаёт вопросов - значит он сам разобрался, или ему это не надо.
Если человек задаёт слишком много вопросов и не дожидается ответов - он не хочет разобраться, он хочет получить готовенькое.
Так, что давай - читай первоисточники. Появится конкретный вопрос - давай, но по одному.
Если не можешь разобраться ВО ВСЁМ - найми учителя.
Записан
Ionn
Участник

ru
Offline Offline

« Ответ #44 : 10-10-2008 16:42 » 

Вообщето я не вижу смысла чтолибо спрашивать.Вопросов по данной теме больше не имею.
Записан
Starech
Гость
« Ответ #45 : 18-10-2008 22:58 » 

EntryPoint:
               
mov ax, 010000b     
mov ds, ax      ;селектор на второй дескриптор  (DATA)       ;пробовал по всякому и на 3 дескриптор
mov ax, 010000b
mov es, ax       ;селектор на 3 дескриптор  (VIDEO)


mov ax, 07034h
mov edi, 0b8000h
stosw



1. Не вижу CX - кол-во копирований AX по адресу ES:EDI
2. Установка адреса экрана текстового режима должна быть в ES!  ES = 0B800h!!!
3. В текстовый режим надо переключатся!  int 10h  AX=0003h (Либо другим способом)

Вроде всё!
Записан
Ionn
Участник

ru
Offline Offline

« Ответ #46 : 20-10-2008 12:19 » 

В текстовый режим переключался еще до перехода в PM.Количество выводимых симоволов всеголишь 1(аски код байта и байт атрибутта), потому и нет никаких until\while
Да...в примере который привел -ошибка=база сегмента к которому происходит доступ через es установлена на b8000h, и команда stosw копирует по линейному адрессу b8000+b8000, это лишь доказывает что пример практически никто не посмотрел...при правильном варианте всеравно не выводится.
Вопрос .
В РЕАЛЬНОМ режиме, без всяких ухищрений типа нереала... пытаюсь выполнить такие команды:
xor ds, ds    ;база сегмента данных в 0
mov dword [ds:dword 0b8000h], 0674356h       ;линейный адресс 0+b8000
транслируется она в следующий вид:
3E6667C70500800B0056436700
здесь видно что префиксы 66 67 должны изменить интерпретацию команды процессором и должно выполниться копирование, gp быть не должно так как лимит сегмента= fffff больше чем сформированный b8000.это не происходит, почему?

Записан
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines