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

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

ru
Offline Offline

« : 24-09-2008 19:55 » 

Здравствуйте товарищи. помогите пожалуйста чем сможете.Решил вот пописать в защищенном режиме, вроде написал простую программку перевода в PM по многочисленным болванкам, но вот вывод на экран прямым копирование в видеопамять не получатеся, посмотрите если несложно, подскажите что я делаю не так, и выложите пожалуйста скомпилированный мой листинг в com файле, неважно каким компилятором(хоть посмотрю в дизассемблере) вообще я комплировал nasm.никак не пойму в чем дело.
вот код:



org 100h
section .text
 
start:
 ; открываем адресную линию A20
    in    al, 92h
    or    al, 2
    out  92h, al

    ; запрет всех прерываний
    cli
    in    al, 70h
    or    al, 80h
    out  70h, al  ; запрет NMI


;.....Загрузка таблицы глобальной в GDTR


mov byte [GDTR], 01fh     ;загружаем размер таблицы -1

xor eax, eax
mov ax, cs
shl eax, 4
add ax, null_desc       
mov dword [GDTR+2], eax         ;лин адресс начала таблицы GDT

lgdt [GDTR]


;......Линейный адресс точки входа

xor eax, eax
mov ax, cs
shl eax, 4
add ax, EntryPoint
mov dword [offset_jmp], eax

;........Включаем защищенный режим, сегментную адрессацию
mov eax, cr0
or ax, 01b
mov cr0, eax

db 066h    ;префикс изменения разрядности операндов
db 0EAh    ;опкод команды jmp far

offset_jmp dd 0h        ;смещение на которые мы прыгаем
dw 01000b    ;селектор на 1-ый дескриптор в gdt


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


mov ax, 07034h
mov edi, 0b8000h
stosw

;mov word [edi], 07043h     ;просто  как вариант  (почему то когда копируешь непосредсвтвенное значение в память то сброс системы(ресет)



hlt     ;отладка

section .data

null_desc db  0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h
;............lim....lim...bas...bas..bas.............. .........pDPstcwa....gr00LIM....bas

code_desc db 0ffh, 0ffh, 000h, 000h, 000h, 010011010b, 010001111b, 000h   ;решил сделать 16 битные сегменты, насм так как 16 код генерирует
 
data_desc db 0ffh, 0ffh, 000h, 000h, 000h, 010010010b, 010001111b, 000h

video_desc db 0ffh, 0ffh, 000h, 080h, 0bh, 010010010b, 000000000b, 000h         ; это лишнее..в точке входа этого нет.про


GDTR dw 0              ;размер таблицы GDT
dd 0                    ;линейный адресс

вот почему не выводится?никак не могу понять
параметры компилятору

nasm -f bin c:\nasm\k.asm -o c:\nasm\k.com


         





Записан
RXL
Технический
Администратор

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

WWW
« Ответ #1 : 25-09-2008 18:53 » 

Ionn, лучше не мучиться и взять "расширитель" DOS (DOS Extender), такой как DOS4G, DOS32 или подобный. Они обеспечивают сервис переключения RM<->PM, плоскую модель памяти и сервис части ф-ий DOS в 32-битном защищенном режиме.
Для работы с видео правильнее использовать сервис VBE - ф-ии int 10h 01ххh. Еще в RM делаешь запрос на получение информации, где должнен быть адрес VBE-сервиса для PM. Так ты сможешь корректно переключать режимы и получать информацию об адресе и структуре фрейм-буфера.
Записан

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

ru
Offline Offline

« Ответ #2 : 26-09-2008 02:51 » 

Спасибо конечно за ответ, направленный на расширение моего кругозора, но весь интерес в том чтобы таки на живом железе, собственными муками потыркать..дабы потом самому например операционку написать, не плоскую а другую модель памяти сделать, в общем войти во вкус, боюсь эмуляторы железа и тем более расширители дос мне не нужны  совсем.А вот насчет прерывания bios int 010h поподробнее пожалуйста, тоесть физический адресс, по которому отображается память видеоадаптера, может быть получен через вызов этой int .что-то я не понял, адресс то всегда один и тотже, и что с того что функция вернет мне тотже адресс первых банок, или как там их?моя ведь задача в защищенном режиме правильно сформировать логический адресс(который будет указывать на физически видеопамяти и соответственно  записать по нему данные.почему не получается?
Записан
Ionn
Участник

ru
Offline Offline

« Ответ #3 : 26-09-2008 03:26 » 

вообщето я тут подумал...что немного погорячился.Например у Зубкова сказано, что для 'Чтобы вывести изображение, используются два механизма — переключение банков видеопамяти для реального режима и LFB (линейный кадровый буфер) для защищенного.
Во втором случае вся видеопамять отображается на непрерывный кусок адресного пространства, но начинающегося не с адреса 0A0000h, а с какого-нибудь другого адреса, так чтобы весь образ видеопамяти, который может занимать несколько мегабайтов, отобразился в один непрерывный массив. В защищенном режиме максимальный размер сегмента составляет 4 гигабайта, поэтому никаких сложностей с адресацией этого буфера не возникает. Буфер LFB можно использовать, только если видеоадаптер поддерживает спецификацию VBE 2.0
Для того чтобы вывести копирование в эту видеопамять обязательно вызвать

mov ax, 04f01h  ;инфа об svga
mov cl, 013h   ;режим vga 640x480
mov ch, 1000000b  старший байт бит 13 ускорение. 14-использование LBF
 int 010h
по адрессу ES:DI фрейм о режиме
 где два байта по смещению [es:di+28] есть физический адресс буфера LBF . так?
чуть позже попробую , но вот уже сейчас напрашивается вопрос-у меня программа лежит вывода на экран копированием по адрессу b8000 (тесктовый, что собственно я пытался сделать)так вот-она то работает и без этого всего..почему у меня не работает..Не понял
Записан
Ionn
Участник

ru
Offline Offline

« Ответ #4 : 26-09-2008 03:27 » 

что-то я похоже путаю понятия-что такое буффер LBF ?
Записан
Ionn
Участник

ru
Offline Offline

« Ответ #5 : 26-09-2008 03:28 » 

выходит для разных режимов и проч..физический адресс начала буфера может быть разный?!
Записан
Basurman
Опытный

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

« Ответ #6 : 26-09-2008 05:12 » 

Ionn, зачем задавать так много вопросов.
1. Надо взять и прочитать спецификации стандартов VESA и VBE. Они многократно печатались и на русском. В конце 90-х была серия из двух статей с описаниями стандартов в журнале или "Мир ПК" или "Компьютер ПРЕСС".
2. Расширенные функции BIOS для 32-х разрядного режима (необязательно защищённый, может быть и так называемый Unreale) вызываются несколько иначе, чем для 16-ти разрядного режима. Подробности опять же в спецификациях. Почитать хотя бы Гука "Аппаратные средства IBM PC", информация там конечно не полная - но что бы начать экспериментировать хватит.
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #7 : 26-09-2008 10:17 » 

Присоединяюсь: очень много вопросов сразу - лучше сперва проштудировать VBE.

LFB - линейный фрейм-буфер. Т.е. - не фрагментированный, как при страничном переключении, а непрерывная область в памяти. Адрес зависит от адаптера и видеорежима. Лучше не VGA режимы использовать, а SVGA (работу с ним и обеспечивает VBE).

VBE - VESA BIOS extension. Сервис Video BIOS для RM и PM. RM сервис предоставляется через int 10h, PM - через far call (адрес вызова можно получить из структур описания VBE в режиме RM). Есть много версий VBE, предоставляющих разный уровень сервиса. Современные видеоадаптеры (скажем, выпущенные за последние лет 5 или больше) предоставляют VBE версии не ниже 3.0 - там есть и управление видео-режимами, и LFB, и управление частотой кадровой развертки, и доступ к сервису из PM.
Прямую работу с портами адаптера не рекомендую. И просто слишком много и они стали много сложнее, чем во времена EGA и VGA.

Писать свою ОС - занятие неблагодарное. Тем более под платформу PC - их для нее навалом. Если только для общего развития... Улыбаюсь
« Последнее редактирование: 26-09-2008 10:19 от RXL » Записан

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

ru
Offline Offline

« Ответ #8 : 26-09-2008 20:21 » 

Да...пожалуй..Гука прочесть надо..как только так сразу буду пробовать, но всеравно чето не понятно почему одна программа работает ,  а моя нет.Насчет ОС это было к слову..может мне охота попробовать написать модел памяти на прикладном уровне адрессации(сегментной) и только и все 3 кольца задействовать, вообще я все это затеял для того чтобы написать искусственный интеллект.идея есть , но нужна сегментная модель.Ну да ладно ..позже..щас разберусь с VBE.
Записан
Ionn
Участник

ru
Offline Offline

« Ответ #9 : 01-10-2008 06:56 » 

Снова здравствуйте..то что ознакомился со способами отображения видеопамяти на системную ничего не дало..ну добавил
mov ax, 04f02h
mov bx, 0112h   ;не использовать LBF, сегментный адресс окна A000 для этого режима
int 010h
в самом начале программы..
и по прежнему ничего не выводится ни в растровом ни в текстовом виде.
совсем непонятно стало..один момент
вот строчки копирования

mov ax, 07034h
mov edi, 0b8000h
stosw

код после компилятора получается 16 битным..когда дескриптор описывает 16 битный сегмент то все перезагружается, когдже 32 битный сегмент то ничего не выводится..ничего не пойму.

Записан
RXL
Технический
Администратор

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

WWW
« Ответ #10 : 01-10-2008 07:24 » 

Ionn, ты в реальном режиме находишься?

Для 32-битного режима (он возможет только в PM) используй модель памяти .flat и признак .386. Дома гляну старые исходники - ничего сложного там нет. Только само по себе в 32-битном режиме не заработает.

DOS работает только в 16-битном режиме! И пофиг, какой ты ког генеришь - интерпретироваться он будет только как 16-битный, а если подсунешь ему 32-битный, то будет вообще лажа.

Должно быть два блока кода: 16-битный для подготовки и переключения в PM и 32-битный для PM.
« Последнее редактирование: 01-10-2008 07:29 от RXL » Записан

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

ru
Offline Offline

« Ответ #11 : 01-10-2008 07:35 » 

Ну как я подозреваю -да..в реальном..дискету загрузочную под ХП отформатировал и с нее запускаю..в том то и дело что насм не поддерживает моделей памяти..разрядность отдельных инструкций(или отдельной секции) задается программистом, тот код что у меня полностью 16 разряден..соответсвтвенно только дальний jmp изменен префиксом.и вот что получается-переходит проц в защищенный режим и исполняет в 16 битном сегменте(4гб) 16 битную команду копирования в линейный адресс и перезагружается..если 23 битный сегмент то ничего не выводится..знаю что ничего сложного..но почемуто не работает.именно моя..у меня есть откомпилированный тасмом код похожии..формат exe я сначала подумал что расширитель дос на дискете и режимы видеоадаптера переключает(для этого и включил 012H)всеравно тоже самое..
Записан
Ionn
Участник

ru
Offline Offline

« Ответ #12 : 01-10-2008 08:04 » 

то что код в дос 16 битен это понятно)селекторы описывают 16 битные сегменты.но префиксом то ведь изменяется код, тоесть проц всеравно выполнит far jmp( ставим префикс изменения разрядности операндов, хотя это лишнее можно и ..стоп..))))ведь far может выглядеть и как cs:eip  и как cs:ip , разница между этими командами в разрядности операндов, насколько я понимаю когда cs пезагружается любой из команд к базе прибавляется число(смещение..32 битное..из eip или ip но так как программ первоначально находится в линейных адрессах в пределах 1 мб то неважно что это будет 16 битный число из ip или 32 число из eip..вообще дело не в этом.
Записан
Ionn
Участник

ru
Offline Offline

« Ответ #13 : 01-10-2008 08:09 » 

)))не так сказал..конечно не из IP и EIP а из операндной составляющей смещения команды дальнего прыжка, откуда она и загрузится в EIP(IP)......)))блин..наверно ни один человек так долго не пытался увидеть HelloWord в защищенном режиме..как я блин.
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #14 : 01-10-2008 08:37 » 

Ionn, открывай справочник по командам и читай отличия того же jmp для разных режимов.

Префиксами можно менять адресацию и разрядность данных, но не режим! В RM у тебя адрес команды CS:IP и никак иначе. Нельзя вырваться за предел 1 МБ (только фича himem: 0xFFFF0 + 0xFFFF = 0x10FFEF).
« Последнее редактирование: 01-10-2008 08:40 от RXL » Записан

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

ru
Offline Offline

« Ответ #15 : 01-10-2008 08:51 » 

полностью согласен) с тем для разных jmp меняется разрядность операндной части...именно это я и хотел сказать..только коряво вышло.прыгнуть в защищенку можно и jmp cs:ip и jmp  cs:eip ...просто я во многих источниках сталкивался якобы с 'глюками ' процессора , мол он прыгает и так и так..так и должно быть !) hlt то после прыжка выполняется(что означает что процессор в PM)
Записан
Ionn
Участник

ru
Offline Offline

« Ответ #16 : 01-10-2008 08:54 » 

тьфу))))что написал..не cs:eip а [cs:32битноечисло] и [cs:16битное число] не думаю что пишу..извините)
Записан
Serg79
Команда клуба

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

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

Ionn, для программирования на таком "низком" уровне требуются соответствующие инструменты, такие как компилятор языка 'C', ассемблер и линковщик. Для этих целей советую завести дополнительную OpenSource систему, будь то FreeBSD, Linux или что то другое. Те инструменты разработки которые присутствуют в них (gcc, as, ld, ar, make) дадут Тебе полную свободу в твоих действиях. Только предупреждаю за ранее, что бы начать пользоваться ими в полной мере Тебе понадобиться время для их изучения. И времени понадобиться много, не думай что после одного вечера Ты их освоишь в полной мере. Но уж если Ты их освоишь то Ты по достоинству оценишь те возможности которые они дают. Win-да стоит в сторонке и курит Улыбаюсь

Прикрепил архивчик, там пример перехода в защищенный режим с последующим выводом двух символов на терминал. Там собирается два бинарника 'boot' и 'kernel'. 'boot' устанавливается в загрузочный сектор (0 сектор) дискетки, а 'kernel' записывается на дискетку начиная с первого сектора. При загрузке компьютера, BIOS загружает, с нулевого сектора, 'boot' в память и передает ему управление. Тот в свою очередь загружает 'kernel' в память и передает управление ему. 'kernel' переводит процессор в защищенный режим и отображает два символа на терминале. Отображение символов производиться непосредственной записью в видео память.

* build-0.02.tar.gz (4.93 Кб - загружено 1177 раз.)
Записан
Serg79
Команда клуба

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

WWW
« Ответ #18 : 03-10-2008 06:57 » 

Добавил еще один архив.

Там уже реализованы примитивный драйвер дисплея, реализует функцию 'putchar', аналогичную библиотечной языка 'C'. На ее основе построены функции 'puts' и 'printk'. Обвязка вокруг настройки прерываний. Примитивный драйвер клавиатуры. Описаны исключения процессора в защищенном режиме.

При переходе в защищенный режим включается страничное преобразование. Инициализируется только первый 750 КБайт памяти (полностью захватывает видео память). Виртуальная память тождественно отображается на физическую, т.е. нулевой адрес виртуальной соответствует нулевому физическому ну и т.д. Запускаются две задачи (main.c: func_1, func_2). Эти задачи выполняются в третьем кольце защиты процессора. Первой задаче выделяется в два раза больше процессорного времени чем второй. Каждая выводит символ на терминал. Для этого реализован системный вызов, который через шлюз прерывания понижает свой уровень до нулевого и записывает переданный символ непосредственно в видео память.

* build-0.07.tar.gz (11.31 Кб - загружено 1131 раз.)
Записан
Serg79
Команда клуба

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

WWW
« Ответ #19 : 03-10-2008 07:09 » 

Добавил еще один архив. Улыбаюсь

Там уже пример реализации примитивного драйвера floppy-дисковода. Что делает данный код можно посмотреть в функции 'main' файла 'main.c'. В ней 'switch', каждый номер которого соответствует цифровой клавише на клавиатуре.

Кстати, помимо всего, данный образ может делать довольно полезную вешь, при нажатии цифровой клавиши '6' производиться низкоуровневое форматирование дискетки. Я в свое время, дома все дискетки отформатировал Улыбаюсь .

Забыл добавить. Все примеры, этот и приведенные выше собираются командами:
-----------
make dep
make
-----------
Устанавливаются на дискетку командой:
-----------
make install
-----------

* build-0.08.tar.gz (15.41 Кб - загружено 1165 раз.)
Записан
Ionn
Участник

ru
Offline Offline

« Ответ #20 : 05-10-2008 11:50 » 

Serg79, спасибо конечно за внимательность но Вы сделали ненужную лично мне работу, то что Вы предложили в исходниках мне совершенно не нужно, насчет того что выгоднее использовать для экспериментов такого уровня позикс совместимые системы ничего мне не говорит, это лишнее..и кстати я предопочел бы qnx...да и С я не знаю и изучать его желания нет.если нетрудно укажите мне в чем моя ошибка в моем примере.
Записан
Ionn
Участник

ru
Offline Offline

« Ответ #21 : 05-10-2008 18:42 » 

хорошо..всего один вопрос..что означает понятие 32 битный или 16 битный код ..32 битный сегмент данных и 16 битный сегмент данных.все ..мне больше ничего не надо.
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #22 : 05-10-2008 19:06 » 

Ionn, раз не хочешь править, то значит твой пост идет в помойку...

Разрядность сегмента кода определяет тип адресации по умолчанию - 16 и 32. Префиксы позволяют переключить на противоположный тип.

Разрядность сегмента данных влияет только на стековые операции.
« Последнее редактирование: 05-10-2008 19:08 от RXL » Записан

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

ru
Offline Offline

« Ответ #23 : 05-10-2008 20:07 » 

ну то что адрессация данных определяется битом D в дескрипторе(затем она в cs ss, после загрузки соответсвтующих селекторов) это понятно.Адрессация инструкций
 для RM =база из скрытых частей сегмнт.регистра +значение из ip.
для PM =база из скрытых частей сегмент.регистра+ значение eip
для PM всегда справедливо то что используется eip?если сбросить  бит D скрытой части сегментного регистра ?
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #24 : 05-10-2008 20:17 » 

Ionn, если тебе действительно это интересно, то возьми спецификацию команд процессора - там это подробнейшим образом описано.
Записан

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

ru
Offline Offline

« Ответ #25 : 05-10-2008 20:28 » 

вообщето я много чего уже изучил..начиная от формата команд и заканчивая режимами..но нигде ..ну нигде не нашел то что мне надо.в одном месте промелькнул загадочный пост-как процессор выбирает инструкции...использование 8 битного кода.(независимо от бита D)но все ссылки то ведут на мануал интела.а с английским проблемы.
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #26 : 05-10-2008 20:45 » 

Ionn, у нас принято писать по-русски, а шифрограммами. Если не знаешь английского, тогда изучай русский.
Записан

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

ru
Offline Offline

« Ответ #27 : 06-10-2008 07:23 » 

Ionn, адресация данных, с точки зрения генерации кода, не зависит от бита D. Она зависит от директив ассемблера (напр. USE32). Если использована директива USE32, то префикс 67h заставляет вычислять компилятор ассемблера смещения как 16 битные. И наоборот. Есть еще префикс размера операнда - 66h. В 32 битном режиме размеры операндов по умолчанию равны 8 и 32 бита. Префикс 66h позволяет использовать 16 битные операнды. В 16 битном режиме размеры операндов по умолчанию равны 8 и 16 бита. Префикс 66h позволяет использовать 32 битные операнды. Префикс 66h автоматически ставиться ассемблером...
Записан

while (8==8)
RXL
Технический
Администратор

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

WWW
« Ответ #28 : 06-10-2008 07:42 » 

sss, это генерация кода - среда исполнения должна соответствовать ему - иначе нет смысла.
Записан

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

ru
Offline Offline

« Ответ #29 : 06-10-2008 09:02 » 

RXL, а если я хочу использовать 32 битные операнды и адреса в 16 битной задаче? В принципе соответствия я согласен, конечно.
Записан

while (8==8)
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 » 

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