Если ты не затёр IDT реального режима, то int 15h действовать должно, но возможно нужно ещё сохранить область данных BIOS.В общем,память 0-500h должна быть не испорчена.
Т.е. если я, например, расположу код вида Код (Text): mov ax,5301h sub bx,bx int 15h по адресу 1000h, то переход в реальный режим должен выглядеть так Код (Text): mov word ptr fs:[467h],1000h mov word ptr fs:[469h],0 cli mov al,8fh out 70h,al mov al,5 out 71h,al mov al,0feh out 64h,al wait_reset: jmp wait_reset при этом не надо затирать память 0-500h. Я так все понял?
Если 1000h - это физический адрес, то не mov word ptr fs:[467h],1000h, а mov word ptr fs:[467h],100h (0100:0000) А так всё правильно.
Насчёт 0-500h я точно не знаю. Я знаю, что когда комп перезагружается таким образом,то BIOS инициализирует контроллёр прерываний и исполняет твой код.Мне неизвестно, инициализируется-ли IDT,так что лучше подстраховаться.
Все заработало! Спасибо за советы. Только возник другой вопрос, как осуществить перезагрузку системы не просто через сброс процессора, а чтобы процедура тестирования не выполнялясь, т.е. как при выполнении перезагрузки Windows. Где-то читал, что достаточно записать 0 в ячейку 0fh CMOS и выполнить сброс процессора, но у меня процедура тестирования все равно выполняется.
Попробуй записать 4 в ячейку 0fh CMOS. Не знаю точно работает-ли,но по идее BIOS должна сразу грузить ОС с диска, без всяких POST.
Нет не получается. Эмулятор Bochs выдает PANIC Unimplemented shutdown status: 04, на реальном компе пока не проверял.
Попробуй выйти в реальный режим и выполнить int 19h. P.S. Я тоже пытаюсь писать свою ОСь. Я только начал, и у меня возникла проблема: аппаратные прерывания не работают. Исключения работают прекрасно. Я больше чем уверен, что в твоей ОСи аппаратные прерывания занимают вектора 20-2F(как и у меня). Не мог ли ты показать код, который перепрограммирует контроллёр прерываний?
Перепрограммирую контроллер прерываний я таким образом: Код (Text): mov al,00010001b out 20h,al mov al,20h out 21h,al mov al,00000100b out 21h,al mov al,00000001b out 21h,al Ты это хотел узнать? После этого все аппаратные прерывания перемещаются на 20h.
А слабо разобраться в коде MenuetOS (кстати на этом форуме ее упоминание не запрещено?)? Операционных систем, которые пишет один человек очень много (даже чисто ассемблерных много), поэтому стать первопроходцами все равно не удастся. Так может лучше присоединится к существующему проекту - MenuetOS, АТОМОС, Miraculix, GreyOS, Visopsys, SkyOS, BeOs, ReactOs или к unix-системе? (полный список http://en.wikipedia.org/wiki/List_of_operating_systems
Самый лучший ответ, на мой взгляд у _BC_ если заниматься этим профессионально, то надо именно выкопать PMBASE (то есть чипсет то освоить свой надо) и уж там по сути регистров и "злодействовать". Интересовался год назад, путем упрямства ходил по извилистым путям int 15h..., потом SoftIce отловил последние магические действия на моем VIA686A... ну и что думаете? До идиотизма просто оказалось. Чистовой результат для данного чипсета таков mov al, 0x57 mov dx, 0x402F out dx, al ;--------------- капец питанию ATX! Пишите если на других VIA сработало, ладно? PS: естественно все работает прямо в... ДОСе!)
valeri А где инициализация второго контроллёра? Я использовал этот код, но наверно он не работает. Код (Text): mov al, 11h out 20h, al out 0A0h, al mov al, 20h out 21h, al mov al, 28h out 0A1h, al mov al, 4 out 21h, al mov al, 2 out 0A1h, al mov al, 1 out 21h, al out 0A1h, al
Второй контроллер я пока не инициализировал, но тут все аналогично, только порт 20h заменяем на a0h, далее в порт a1h номер обработчика для IRQ8, что делатся в строках mov al,00000100b out 21h,al я сам не совсем разобрался, по-моему надо отправить тоже самое, но в порт a1h. Затем тоже самое, что и для первого контроллера, но в регистр a1h.
valeri Нашёл ошибку. Мой код правильный(наверно ). Ошибка оказалась в другом месте. Зато при тестировании возник другой вопрос: если во время работы оси двинуть мышь, то ось виснет. Не могу понять, где ошибка: ведь контроллёр инициализирован, прерывание от таймера работает. halyavin Создание своей ОСи, даже самой примитивной, доставляет большое моральное удовлетворение...
Как это виснет? Т.е ты хочешь скачать, что когда ты двигаешь мышкой у тебя возникает прерывание? В этом случае ты устновил соответствующий обработчик?
Я обрабатываю прерывания только от клавиатуры и таймера. Код остальных прерываний для 1 контроллёра такой: Код (Text): push eax mov al,0x20 out 0x20,al pop eax iretd Код прерываний для 2 контроллёра такой: Код (Text): push eax mov al,0x20 out 0x20,al out 0xa0,al pop eax iretd Мышь выдаёт прерывание, которое обрабатывается 2 контроллёром(№ 12 ?). Но у меня есть все обработчики всех прерываний.
а таймер тут ни при чём! Двинул мышь->генерация пакета отт неё в KBC->генерация IRQ12->НАДО ЭТИ БАЙТЫ ВЫЧИТАТЬ из KBC... Усёк? Буферок то есть но небольшой. Да и потом невычитав принятое, ты затыкаешь обработку других... Поставь хотя бы чтение без использования _IRQ12_: push eax in al, 0x60 ; - ) берем мышь за жабры ) mov al,0x20 out 0x20,al out 0xa0,al pop eax iretd
_VaStaNi_ Спасибо за пояснение. P.S. Когда я говорил о таймере, я подразумевал, что IDT и контроллёр правильно настроены и прерывания работают.