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

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

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
Технический
Администратор

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
Технический
Администратор

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
Технический
Администратор

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 Кб - загружено 1240 раз.)
Записан
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 Кб - загружено 1194 раз.)
Записан
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 Кб - загружено 1244 раз.)
Записан
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
Технический
Администратор

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
Технический
Администратор

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

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

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

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

ru
Offline Offline

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

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

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
Технический
Администратор

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)
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines