OSDev http://osdev.su/ |
|
Virtual 8086 mode http://osdev.su/viewtopic.php?f=6&t=522 |
Страница 2 из 4 |
Автор: | grindars [ 03 апр 2012, 20:42 ] |
Заголовок сообщения: | Re: Virtual 8086 mode |
К тому же, лично я считаю, что писать 32-битную ОС сейчас бессмысленно. Во всех современных процессорах есть 64-битные расширения, а к тому моменту, как вы ось допишете, чисто 32-битные уже окончательно отомрут. |
Автор: | SII [ 03 апр 2012, 20:46 ] |
Заголовок сообщения: | Re: Virtual 8086 mode |
Честно говоря, не знаю, как бы поступил, если б делал ось для IA-32 (независимо от того, была бы она 32- или 64-разрядной). Но думаю, что не использовал бы V86, а просто на этапе загрузки и инициализации системы переключался бы в реальный режим каждый раз, когда мне нужно было бы дёрнуть BIOS. |
Автор: | valeri [ 03 апр 2012, 21:02 ] |
Заголовок сообщения: | Re: Virtual 8086 mode |
Да, я тоже придерживаюсь такого подхода, его и реализовал у себя. |
Автор: | grindars [ 03 апр 2012, 21:23 ] |
Заголовок сообщения: | Re: Virtual 8086 mode |
Это работоспособный вариант, но если надо использовать граф. драйвер на основе VBE и необходимо переключать видеорежимы во время работы? Тут уже надо вызывать видеобиос. Есть интерфейс защищенного режима, но на настоящем железе я ни разу его не видел. Так что без эмуляции, аппаратной или программной, не обойтись. Не в реальный же режим скакать, в конце концов. |
Автор: | pavia [ 03 апр 2012, 21:27 ] |
Заголовок сообщения: | Re: Virtual 8086 mode |
Рассказываю. Разбирался с аппаратной визуализацией. Сложного нет, но есть куча нюансов. Поэтому от аппаратно 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; |
Автор: | phantom-84 [ 03 апр 2012, 21:37 ] |
Заголовок сообщения: | Re: Virtual 8086 mode |
SII писал(а): Но думаю, что не использовал бы V86, а просто на этапе загрузки и инициализации системы переключался бы в реальный режим каждый раз, когда мне нужно было бы дёрнуть BIOS. Я об этом думал, тем более что мне полноценная виртуальная машина для 16-разрядных приложений даром не нужна (мне нужно запустить один экземпляр конкретного 32-разрядного приложения, написанного под мою ось, для которого все обращения к системе для работы с аппаратурой выполнялись бы через BIOS). Но смущает, не слишком ли накладно выполнять такие переключения с учетом того, что аппаратные прерывания тоже должны обрабатываться кодом BIOS (я даже думал над тем, чтобы хотя бы обработку прерывания от таймера эмулировать в защищенном режиме, но это как-то криво). Я боюсь забирать у BIOS обработку аппаратных прерываний и запускать собственные драйверы, хотя по сути от BIOS мне нужен только дисковый сервис для работы с хардами и флешками.
|
Автор: | pavia [ 03 апр 2012, 21:40 ] |
Заголовок сообщения: | Re: Virtual 8086 mode |
Цитата: phantom-84 » 03 апр 2012 13:59 DJ PhoeniX писал(а): Да я понимаю, что можно и доки пораскуривать, вопрос в необходимости. Ради двух-трёх интов курить 10 страниц - как-то непродуктивно... Кстати, если все-таки решишь разобраться основательно, можем скооперироваться. У меня недавно возникла задача запустить одно приложение под мою ось на основе сервиса BIOS 10h/13h/16h, не "убивая" таймерный и другие обработчики BIOS'а, т.е. без родных дров и полноценного ядра Можно и скооперироваться. Проще всего взять BOCHS или DOSBOX и скомпилировать под свою ОС выкинув лишнее. Как именно запустить приложение в своей ОС планируете с полной виртуализацией BIOS или без. Насколько планируете виртуализовать BIOS и железо? Просто когда посмотрел доки на CMOS желание писать эмулятор железа отпала пусть уж напрямую работает. Слишком много режимов у CMOS если досконально делать в одиночку не потянуть. |
Автор: | pavia [ 03 апр 2012, 21:47 ] |
Заголовок сообщения: | Re: Virtual 8086 mode |
Цитата: Я об этом думал, тем более что мне полноценная виртуальная машина для 16-разрядных приложений даром не нужна (мне нужно запустить один экземпляр конкретного 32-разрядного приложения, написанного под мою ось, для которого все обращения к системе для работы с аппаратурой выполнялись бы через BIOS). Но смущает, не слишком ли накладно выполнять такие переключения с учетом того, что аппаратные прерывания тоже должны обрабатываться кодом BIOS (я даже думал над тем, чтобы хотя бы обработку прерывания от таймера эмулировать в защищенном режиме, но это как-то криво). Я боюсь забирать у BIOS обработку аппаратных прерываний и запускать собственные драйверы, хотя по сути от BIOS мне нужен только дисковый сервис для работы с хардами и флешками. Жалко что 32-битное, эти команды ещё не делал. Боюсь что доступ к флэшкам биос делает через защищенный режим. Это ещё и защищенный режим эмулировать надо будет. Что за приложение такое что переписать не хотите а хотите эмулировать? |
Автор: | grindars [ 03 апр 2012, 21:51 ] |
Заголовок сообщения: | Re: Virtual 8086 mode |
Те BIOSы, что я смотрел, работают с USB через SMM, вызывая SMI через регистры чипсета. |
Автор: | phantom-84 [ 03 апр 2012, 22:20 ] |
Заголовок сообщения: | Re: Virtual 8086 mode |
pavia писал(а): Как именно запустить приложение в своей ОС планируете с полной виртуализацией BIOS или без. Насколько планируете виртуализовать BIOS и железо? Я выше уже отписался. Все гораздо проще. Мне нужно, чтобы все харды и флешки, видимые BIOS, были видны моему приложению, скажем, под именами bda, bdb и т.п. и чтобы приложение посредством эмулирующей системы могло различать харды и флешки (или хотя бы (S)ATA-, SCSI-, USB-диски). Мне нужно, чтобы с одной стороны работал дисковый сервис BIOS, а с другой одно единственное 32-разрядное приложение.Цитата: Жалко что 32-битное, эти команды ещё не делал. Мне не нужна полная эмуляция, мне нужно обращение к сервису BIOS из PM. Насчет флешек и защищенного режима, возможно, ты прав (у кого-нибудь еще есть какие-либо мнения на этот счет?). Тогда придется переключаться в RM. Если переписывать, то только для RM, а хотелось бы запустить готовое приложение (даже без перекомпиляции).
Боюсь что доступ к флэшкам биос делает через защищенный режим. Это ещё и защищенный режим эмулировать надо будет. Что за приложение такое что переписать не хотите а хотите эмулировать? |
Страница 2 из 4 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |