Вобщем, делаю что-то вроде простейшей 32бит ОС. Плоская модель. Пейджинг и мультитаск отсутствуют. Что-бы каллбачить BIOS и DOS прерывания выхожу в чистый реал, а хочеться из V86... Первоначально мой проект основывался на PMODE307. Вобщем механизм попадания в V86 довольно прост, однако с выходом из него что-то не все так просто... Помогите, если можете!
V86 предназначен лишь для совместимости со старым софтом. Использовать его для новых разработок - ересь! Для кого PM делался?!
Ну походу я еретик.. Да и разработка не нова хачу вот пень166 переделать не знаю под чево... Извращаюсь короче... А мне BiOs c DOS нужен на первое время... Для китайцкой армии.. (жутка) Ну ломает писать всю хрень под хардваре... Хочу пока с процом розобраться а там продолжить...
trash С с выходом из него можно познакомиться в исходниках винды, или разреверсить обработчики #UD и #GP, для выхода из этого режима используются запрещенные инструкции как правило, типа как C4h в ntvdm, вызывает #UD либо intxx, in/out, вызывают #GP. Сорцы посмотри, помоему ничего сложного.
У меня их нет, обхожусь ICE-ом... В Win9X, из ринг0 выхожу в V86, все вроде номано трассируеться.. То бишь делаю в V86 Int - и опять выхожу в ринг0... В голом DOS - IDT/GDT подготовлен. В V86 выхожу.. Делаю Int - и словно ресет. Наверно нужно загружать TSS (хотя как неохота с этим пока связываться)
Да нормально можно без тсс поработать, если... если ограничиться, например иследованием поведения аппаратных INT обработчиков и IDT... У меня в проекте пока именно так драйверные вещи в PM обкатываются. НО! Но INT обработчики целиком мои и именно это и цель - пока победить популярные железяки в плане обработки их прерываний в PM для создания собственных драйверных решений под свою ось под свои задумки, просто, универсально, оптимально... В плане твоих вызовов INT и ресета как следствие - думаю ты не учитываешь, что там внутри будет с DS, ES,... т.к. я понимаю ты ныряешь в существующие BIOSовские, а они дают тебе жестокие исключения. Вожможно, если легализовать их занчения в GDT, обьявив соответсвующим образом, что хотябы ресет исчезнет, а там дальше - больше... Но считаю это, мягко говоря - неоптимальностью.
Да на "УРА"... Отсутствие пэйджинга (бит 15 = 0 в CR0) - упрощает работу с памятью. И (субьективно) - режим этот более стабилен. TR (регистр задач) и все что с ним связано я не трогаю. Бит NT(nested task) в EFLAGS = 0... Хотя и его загружал селектором-НЕПОМОГАЕТ. Обработчики прерываний стоят, и в FLAT PM, работают... А захожу в V86 и делаю фаулт/прерывание вылетаю в перезагруз. Также пока не трогаю V86-расширений...
Если верить Интелу, чтобы войти в V86, нужно как минимум две задачи (основная и задача v86). А при выходе автоматически происходит переключение задач. Сам с этим не эксперементировал, но Интелу пока верю А как ты входишь в V86 без всего этого?
Надо в ринг0 делать: mov eax, esp push rm_gs push rm_fs push rm_ds push rm_es push rm_ss push eax //push esp push 23046h //PUSH EFL push RM_CS //push V86 segment push offset V86proc iretd Здесь рулит значение регистра флага. Если это переход Ring0-V86Ring3, то загружаються дополнительные сегментные регистры... з.ы Винда 9Х так прыгает.
Гм.. Тут у вас кое что нарыл в "брошеной ОСи для 80386". Попробую разобраться со всем этим гемором. Так то оно все ничего, а вот TR/TSS/LDT - то просто мраки какие-то... Отлаживаю как в реал-моде так и на VirtPC. Хм.. код ведет себя по разному. Если верить интелу...
trash ааа, ёптыть, тыж тока в r0, понятно. Не тут без наличия виновника(кода) и бутылки не разберешься, как пральна кто то упомянул, не у всех есть телепатические способности
Попробую набухацца до телепатических способностей, и бросить все нафик. V86-заколдованый режим каойто. Если верить Ынтелу.
trash Нифига себе! Не, вариант наверное рабочий, хотя и не очень понято почему, но это-то точно колдунство И плохо документированное к тому же. 23046h это установленный VM и IOPL равный 11b. Ещё, зачем-то ZF и PF.. Боюсь, что раз уж ты так в режим вошёл, то и возвращаться нужно таким же способом, через iret А стандартный способ возвращения расчитывает на TSS, поэтому и обламывается. А что тебе с TR и TSS неясно? Могу попробовать объяснить.. Правда, опять же, сам с этим не возился пока, только читал. А на LDT - забей, накой он тебе сдался. По поводу виртуальных машин - в них бывают глюки. Редко, но бывают.
trash дарю исходник загружаешь голый дос - без himem/emm386 и запускаешь это переводит дос из real-mode в V86-mode хочешь - разбирайся, спрашивай 1787862645__init.zip
z0mailbox Сорри, не разбирался подробно.. Но зачем такая большая io-map для v86? Разве нельзя просто отбросить завершающие нули?
z0mailbox спасибо, мне все пригодиться! В принципе-то я пытаюсь сделать очень упрощеный вариант вызова V86 подпрограммы. В контексте одной единственной задачи(ядра) без юзанья CR2/CR3...
это полная карта, так просто для разнообразия да, можно обрезать нули с указанием правильной границы в TSS но можно и полную дать - жалко байтов чтоли
Плоховато что init.exe не пашет под Virtual PC. А так довольно простая реализация - без пейджинга. Да, скорей всего нужно создавать новую задачу под V86. Как ни пытался я упростить - получаеться RESET. То есть после установки FLAT PM, прыгаю в V86 и получаю перезагруз.