OSDev http://osdev.su/ |
|
Реализация перезагрузки http://osdev.su/viewtopic.php?f=6&t=298 |
Страница 1 из 2 |
Автор: | Vort_ [ 30 сен 2009, 20:39 ] |
Заголовок сообщения: | Реализация перезагрузки |
всем привет в свободное время пишу свою ОСьку и вот недавно столкнулся с проблемкой не могу нормально сделать ребут из защищенного режима сейчас использую вот такой код: for (;;) { // Keyb Reboot while (TestBit(_inp(0x64), 1)); _outp(0x64, 0xFE); } работает норм в VMware, QEMU, Virtual Box и новом Bochs глючит на старом Bochs (куча ошибок) и на реальном компе (тупо висит) пробовал еще и вот такие блоки: // System Port byte B = _inp(0x92); SetBit(B, 0); _outp(0x92, B); // Triple Fault byte IDTPD[6] = {0}; __lidt(&IDTPD); __asm int 3 тоже результат не радует подскажите пожалуйста кто разбирается в чём может быть проблема неужели прийдётся делать вручную переключение в реальный режим... |
Автор: | Pavia [ 30 сен 2009, 21:50 ] |
Заголовок сообщения: | Re: Реализация перезагрузки |
По поводу зависания, он не висит он работает. Только CMOS надо настроить. Ячейка 0Fh должна содержать 0. Тебе какая перезагрузка интересует мягкая или жесткая? Какая цель перезагрузки. |
Автор: | Vort_ [ 30 сен 2009, 22:31 ] |
Заголовок сообщения: | Re^2: Реализация перезагрузки |
цель - реакция аналогичная нажатию кнопки Reset желательно сбросить всё подобным образом. мало ли как я там запрограммирую устройства... думаю Reset аналогичен жесткой. (пример: загружаюсь с флоппи, проверяю работу ОСи, вынимаю дискету, запускаю ОС в ребут - и гружусь обычным образом в винду) BIOS - это реальный режим :( моя же ОСька работает в защищенке мне бы очень не хотелось вручную переходить в реальный режим... и тем более лезть в ACPI (там кода наверно понадобится больше чем во всей ОСьке)... если это поможет - могу расшарить образ ОСьки и сырцы мож проблема где-то в другом месте... хотя верится слабо |
Автор: | Pavia [ 30 сен 2009, 22:41 ] |
Заголовок сообщения: | Re^3: Реализация перезагрузки |
Жесткая перезагрузка на разных материках выполняется по разному. На Intel через 0CF9h вот код не помню уже давно тестировал. Мягкая перезагрузка Reset: mov dx,0Cf9h mov al,0 out dx,al mov al,0+4 out dx,al jmp $-2; Жесткая перезагрузка Reset: mov dx,0Cf9h mov al,2 out dx,al mov al,2+4 out dx,al jmp $-2; |
Автор: | Himik [ 30 сен 2009, 22:57 ] |
Заголовок сообщения: | Re: Реализация перезагрузки |
Вот более-менее универсальный код. Используется CMOS и контроллер клавиатуры. На языке С++. //Set CMOS outp(0x70, 0x8F); //0xF "Reset Code", 0x80 "NMI Disabled" outp(0x71, 0); //"Software reset or unexpected reset" //Reset by Keyboard Controller outp(0x64, 0xFE); //"Reset" outp(0x64, 0xFF); for(;;) {} |
Автор: | Vort_ [ 30 сен 2009, 23:03 ] |
Заголовок сообщения: | Re^4: Реализация перезагрузки |
сделал вот так: // CMOS Reg 0x0F = 0 _outp(0x70, 0x0F); _outp(0x71, 0x00); for (;;) { // Keyb Reboot while (TestBit(_inp(0x64), 1)); _outp(0x64, 0xFE); } результат тот же - точнее никакой на ВМках всё по прежнему ОК на реальном по прежнему ничего интел это конечно хорошо но хотелось бы совместимый метод вроде через клавиатуру и должен быть совместимым только вот с ним что-то не то на всяк случай вот ОСь: (может кто поможет или просто кому-то будет интересно) "OS Image 2009.09.30 (02).rar" http://slil.ru/28032064 "Kernel 2009.09.30 (02).rar" http://slil.ru/28032067 "DriverPack 2009.09.27 (01).rar" http://slil.ru/28032073 "Tools 2009.09.25 (02).rar" http://slil.ru/28032075 P.S. на реальном компе глючит драйвер 'ATA.bin', поэтому его лучше убрать из Drivers.a |
Автор: | Pavia [ 30 сен 2009, 23:06 ] |
Заголовок сообщения: | Re^2: Реализация перезагрузки |
NMI я так понимаю надо запретить чтобы ACPI не перехватил. outp(0x64, 0xFE); //"Reset" outp(0x64, 0xFF); // если и делать то через 5мс А то ресет может и не сработать. |
Автор: | Vort_ [ 01 окт 2009, 01:13 ] |
Заголовок сообщения: | Re^3: Реализация перезагрузки |
попробовал разные варианты: и такой: // Set CMOS _outp(0x70, 0x8F); // 0xF "Reset Code", 0x80 "NMI Disabled" _outp(0x71, 0x00); // "Software reset or unexpected reset" // Keyb Reboot while (TestBit(_inp(0x64), 1)); _outp(0x64, 0xFE); for (;;); и такой: // Set CMOS _outp(0x70, 0x8F); // 0xF "Reset Code", 0x80 "NMI Disabled" _outp(0x71, 0x00); // "Software reset or unexpected reset" // Keyb Reboot _outp(0x64, 0xFE); _outp(0x64, 0xFF); for (;;); эффект тот же ( в ВМ - ок, на реальном - виснет --- нашел пару багов в ядре и драйвере клавы+мыши починил - оказалось что они не при чём думал может ядро зависает до выполнения кода перезагрузки - тоже похоже не оно (с юзер проги также попробовал выполнить код ребута) --- вот последняя версия с некоторыми багфиксами: "OS Image 2009.10.01 (02).rar" http://slil.ru/28032362 "Kernel 2009.10.01 (02).rar" http://slil.ru/28032363 "DriverPack 2009.10.01 (01).rar" http://slil.ru/28032366 |
Автор: | Himik [ 05 окт 2009, 19:22 ] |
Заголовок сообщения: | Re^4: Реализация перезагрузки |
Тот код используется в моей ОС, и у меня он работает. Чтобы точно всё проверить, попробуй скачать образ CD, записать на CD-болванку и загрузиться. Когда появится белый квадрат нажми Ctrl-Alt-Del, потом любую клавишу. Должна сработать перезагрузка. Образ CD-ROM eos-img-2009.07.18.rar http://code.google.com/p/express-os/downloads/list |
Автор: | Vort_ [ 05 окт 2009, 20:59 ] |
Заголовок сообщения: | Re^5: Реализация перезагрузки |
загадочно твоя ОСь норм всё ребутает значит как-то отличается окружение может дело в видеорежиме? или еще что-то влияет... --- пару дней назад я своей ОСьке таки написал драйвер CD так что если не страшно, попробуй запустить из моей ОСи 'FastReboot.bin' :) интересно - получится ли у тебя ребутнуть комп из моей ОС код этого файла идентичен тому что используется у тебя http://slil.ru/28046117 |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |