OSDev

для всех
Текущее время: 29 апр 2024, 02:34

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Re: Virtual 8086 mode
СообщениеДобавлено: 03 апр 2012, 20:42 

Зарегистрирован: 22 май 2007, 15:29
Сообщения: 283
К тому же, лично я считаю, что писать 32-битную ОС сейчас бессмысленно. Во всех современных процессорах есть 64-битные расширения, а к тому моменту, как вы ось допишете, чисто 32-битные уже окончательно отомрут.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Virtual 8086 mode
СообщениеДобавлено: 03 апр 2012, 20:46 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Честно говоря, не знаю, как бы поступил, если б делал ось для IA-32 (независимо от того, была бы она 32- или 64-разрядной). Но думаю, что не использовал бы V86, а просто на этапе загрузки и инициализации системы переключался бы в реальный режим каждый раз, когда мне нужно было бы дёрнуть BIOS.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Virtual 8086 mode
СообщениеДобавлено: 03 апр 2012, 21:02 

Зарегистрирован: 13 окт 2008, 17:38
Сообщения: 46
Откуда: Владимир
Да, я тоже придерживаюсь такого подхода, его и реализовал у себя.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Virtual 8086 mode
СообщениеДобавлено: 03 апр 2012, 21:23 

Зарегистрирован: 22 май 2007, 15:29
Сообщения: 283
Это работоспособный вариант, но если надо использовать граф. драйвер на основе VBE и необходимо переключать видеорежимы во время работы? Тут уже надо вызывать видеобиос. Есть интерфейс защищенного режима, но на настоящем железе я ни разу его не видел. Так что без эмуляции, аппаратной или программной, не обойтись. Не в реальный же режим скакать, в конце концов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Virtual 8086 mode
СообщениеДобавлено: 03 апр 2012, 21:27 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Рассказываю.
Разбирался с аппаратной визуализацией.
Сложного нет, но есть куча нюансов. Поэтому от аппаратно VM86 отказался в пользу программного, пол ядра под него переписать надо. Программная эмуляция у меня почти всех 286 команд.

Приведу код. Давно разбирался так как что к чему не помню.
Включить VM86 просто это установить нужный флаг. Просто так установить флаг этот нельзя. Один если не единственный способ это сделать используя iretd.
Далее пошли нюансы
Надо установить флаг NT в 0. Какое-то ограничение с обработкой исключений, это тоже обязательное.
and Word [esp], not 4000h //Сбрасываем NT флаг В 0
and Word [esp], not 3000h //Устанавливаем IOPL В 0
Для обработки портов есть разные способы. IOPL у меня стоит в 0, не помню зачем.


VMProg код на языке 8086 вызывающий прерывание и возвращающийся назад в защищенный режим.
Код VMProg копируется в первый мегабайт. Со страницами возиться не стал. В первом мегабайте отводиться так же буфер под данные.
Далее идут нюансы обработки прерываний и привилегированных команд. Порты у меня тоже были привилегированными, зря конечно.
Далее забил так как требовалось много команд эмулировать программно.
К тому же обработка прерываний усложняется. Надо проверить флаг эмуляции после эмулировать нужное прерывание программно.

Код:
var
 VMProg:array [0..29] of Byte=($9C,$0E,$6A,$09,$64,$FF,$2E,$40,$00,$66,$9C,$66,$67,$81,$34,$24,
                               $00,$00,$02,$00,$6A,$08,$66,$68,$00,$00,$10,$00,$66,$CF);
label
  EndRealInt; 
//  JampVM;
procedure InitRealInt;
var p:Pointer;
begin
asm
mov eax,DWord(EndRealInt)
mov DWord PTR [VMProg+18h], eax
xor eax,eax
mov ax,Word PTR [eax+413h]        // Размер Base Memory kb
shl eax,10                      // *1024
sub eax, 64*1024               //-64kb сегмент для наших нужд
mov DWord PTR [p],eax
//move DWord PTR [JampVM],eax
end;
move(VMProg[0],p^, SizeOf(VMProg));
end;


procedure RealInt;
assembler;
asm;
push ebp
push eax

pushf
and Word [esp], not 4000h      //Сбрасываем NT  флаг В 0
and Word [esp], not 3000h      //Устанавливаем IOPL  В 0
popf

xor ebp,ebp
mov bp,Word PTR [ebp+413h]        // Размер Base Memory kb
shl ebp,6                      // *1024/16
sub ebp, 64*1024/16

shl ebp, 4
mov al, Byte PTR [esp+12]       // Номер прерывания из стека
shl al,2                       // *4
mov Byte PTR [ebp+7h], al      // Сохроняем в код виртуального режима

pop eax
shr ebp, 4

push 0                        //GS, FS, DS,ES
push 0                       
push ebp
push ebp
push ebp                      //SS
push 0ffffh                   //ESP
pushfd                        //EFlag
push ebp                      //cs
push 0                        //EIP

xor Dword [esp+8], 20000h     // Изменяем VM флаг


iretd
EndRealInt:


pop ebp
ret
end;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Virtual 8086 mode
СообщениеДобавлено: 03 апр 2012, 21:37 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
SII писал(а):
Но думаю, что не использовал бы V86, а просто на этапе загрузки и инициализации системы переключался бы в реальный режим каждый раз, когда мне нужно было бы дёрнуть BIOS.
Я об этом думал, тем более что мне полноценная виртуальная машина для 16-разрядных приложений даром не нужна (мне нужно запустить один экземпляр конкретного 32-разрядного приложения, написанного под мою ось, для которого все обращения к системе для работы с аппаратурой выполнялись бы через BIOS). Но смущает, не слишком ли накладно выполнять такие переключения с учетом того, что аппаратные прерывания тоже должны обрабатываться кодом BIOS (я даже думал над тем, чтобы хотя бы обработку прерывания от таймера эмулировать в защищенном режиме, но это как-то криво). Я боюсь забирать у BIOS обработку аппаратных прерываний и запускать собственные драйверы, хотя по сути от BIOS мне нужен только дисковый сервис для работы с хардами и флешками.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Virtual 8086 mode
СообщениеДобавлено: 03 апр 2012, 21:40 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Цитата:
phantom-84 » 03 апр 2012 13:59
DJ PhoeniX писал(а):
Да я понимаю, что можно и доки пораскуривать, вопрос в необходимости. Ради двух-трёх интов курить 10 страниц - как-то непродуктивно...
Кстати, если все-таки решишь разобраться основательно, можем скооперироваться. У меня недавно возникла задача запустить одно приложение под мою ось на основе сервиса BIOS 10h/13h/16h, не "убивая" таймерный и другие обработчики BIOS'а, т.е. без родных дров и полноценного ядра

Можно и скооперироваться. Проще всего взять BOCHS или DOSBOX и скомпилировать под свою ОС выкинув лишнее.
Как именно запустить приложение в своей ОС планируете с полной виртуализацией BIOS или без. Насколько планируете виртуализовать BIOS и железо?
Просто когда посмотрел доки на CMOS желание писать эмулятор железа отпала пусть уж напрямую работает. Слишком много режимов у CMOS если досконально делать в одиночку не потянуть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Virtual 8086 mode
СообщениеДобавлено: 03 апр 2012, 21:47 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Цитата:
Я об этом думал, тем более что мне полноценная виртуальная машина для 16-разрядных приложений даром не нужна (мне нужно запустить один экземпляр конкретного 32-разрядного приложения, написанного под мою ось, для которого все обращения к системе для работы с аппаратурой выполнялись бы через BIOS). Но смущает, не слишком ли накладно выполнять такие переключения с учетом того, что аппаратные прерывания тоже должны обрабатываться кодом BIOS (я даже думал над тем, чтобы хотя бы обработку прерывания от таймера эмулировать в защищенном режиме, но это как-то криво). Я боюсь забирать у BIOS обработку аппаратных прерываний и запускать собственные драйверы, хотя по сути от BIOS мне нужен только дисковый сервис для работы с хардами и флешками.

Жалко что 32-битное, эти команды ещё не делал.
Боюсь что доступ к флэшкам биос делает через защищенный режим. Это ещё и защищенный режим эмулировать надо будет. Что за приложение такое что переписать не хотите а хотите эмулировать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Virtual 8086 mode
СообщениеДобавлено: 03 апр 2012, 21:51 

Зарегистрирован: 22 май 2007, 15:29
Сообщения: 283
Те BIOSы, что я смотрел, работают с USB через SMM, вызывая SMI через регистры чипсета.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Virtual 8086 mode
СообщениеДобавлено: 03 апр 2012, 22:20 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
pavia писал(а):
Как именно запустить приложение в своей ОС планируете с полной виртуализацией BIOS или без. Насколько планируете виртуализовать BIOS и железо?
Я выше уже отписался. Все гораздо проще. Мне нужно, чтобы все харды и флешки, видимые BIOS, были видны моему приложению, скажем, под именами bda, bdb и т.п. и чтобы приложение посредством эмулирующей системы могло различать харды и флешки (или хотя бы (S)ATA-, SCSI-, USB-диски). Мне нужно, чтобы с одной стороны работал дисковый сервис BIOS, а с другой одно единственное 32-разрядное приложение.

Цитата:
Жалко что 32-битное, эти команды ещё не делал.
Боюсь что доступ к флэшкам биос делает через защищенный режим. Это ещё и защищенный режим эмулировать надо будет. Что за приложение такое что переписать не хотите а хотите эмулировать?
Мне не нужна полная эмуляция, мне нужно обращение к сервису BIOS из PM. Насчет флешек и защищенного режима, возможно, ты прав (у кого-нибудь еще есть какие-либо мнения на этот счет?). Тогда придется переключаться в RM. Если переписывать, то только для RM, а хотелось бы запустить готовое приложение (даже без перекомпиляции).


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB