Может кто подскажет, как выполнить выключение питания компьютера на ассемблере, но не из под Windows. Я знаю, что это возможно в реальном режиме через int 15h. А можно ли выключить компьютер из защищенного режима.
>А можно ли выключить компьютер из защищенного режима. Само-собой.... могу даже показать свою прогу... >Да, можно и делается из ядра. Из какого ядра? Можно и через драйвер!
2 valeri только одно на ум приходит ACPI 2 volodya no comment Если не ошибаюсь то у чела есть ОСь(своя) с подобием драиверов он наверное про них?
2 halyavin Достали чесно говоря с менуетом - такая лажа там порой встречается в ядре версии 0.72 если не ошибаюсь в файле shutdown.inc для выключения компа совершался переход в режим реальных адресов и выключался комп через вышеупомянутый INT 15h (APM BOIS)
Ага, а по-другому тяжело написать будет. Пока что универсального способа сделать это через порты не придумано (точнее придумано, но держится в секрете соотвествующими фирмами). (Извиняюсь, что сразу не вспомнил как комп выключается в менуете - int 15h valeri, по-видимому, не интересует) Частных способов я, к сожалению, не помню. Возможно что-то про это есть на сайте АТОМОС или, по крайней мере, они эти занимались и могут подсказать как это делается. Есть в менуете и "лажа". Но люди постепенно занимаются ее исправлением (я в том числе). Попробуй еще по новее ядро посмотреть, желательно с русских сайтов, а не с menuetos.org.
Выключить компьютер можно с помощью ACPI SoftOFF. Сам интерфейс ACPI -- стандарт, но вот базовый адрес портов ACPI можно менять. А вот способ замены/определения базы ACPI-портов (PMBASE) уже 'вендорозависимый'. Но, как правило, база PMBASE равна 4000h. За soft-off отвечает PMBASE + 4 регистр. В общем, лучше посмотри ACPI-спецификацию.
В реальный режим можно переключиться несколькими способами. Вот пример: Code (Text): ; в fs должен лежать селектор дескриптора с базой = 0 mov word ptr fs:[467h],offset in_real_mode mov word ptr fs:[469h],cseg ;сегмент:смещение должны лежать по адресу 40:67 cli mov al,8fh out 70h,al mov al,5 out 71h,al ;устанавливаем код сброса mov al,0feh out 64h,al wait_reset: jmp wait_reset ;сбрасываем процессор in_real_mode: ;реальный режим ; ... int 15h
Code (Text): cseg segment ; ... ; в fs должен лежать селектор дескриптора с базой = 0 mov word ptr fs:[467h],offset in_real_mode mov word ptr fs:[469h],cseg ;сегмент:смещение должны лежать по адресу 40:67 cli mov al,8fh out 70h,al mov al,5 out 71h,al ;устанавливаем код сброса mov al,0feh out 64h,al wait_reset: jmp wait_reset ;сбрасываем процессор in_real_mode: ;реальный режим ; ... int 15h cseg ends cseg - это сегментный адрес метки in_real_mode(адресация реального режима).
Я так понял, что должна использоваться адресация реального режима вида сегмент:смещение. А что если код in_real_mode располагается по адресу за пределами 0fffffh, например, 400000h?
valeri Понял правильно. В любом случае код, исполняемый в реальном режиме должен располагаться по физическому адресу меньше 0fffffh. Что-бы можно было ответить, скажи, что ты пишешь? Свою ось?
>Если не ошибаюсь то у чела есть ОСь(своя) с подобием драиверов он наверное про них? Да, в моей оси как-раз драйвер ACPI отвечает за PowerOFF, до появления драйвера ACPI, мне приходилось переходить в V86 для выполнения пруцедуры с int 0x15.