Вот лишний повод впасть в заблуждение
; 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 бит для смещения не используется.
только не надо расстреливать за такой еретизм.нефига не знаю..потому и затеял всю эту кашу.