OSDev
http://osdev.su/

Гугл подвел... Ищется функция scan2ascii...
http://osdev.su/viewtopic.php?f=6&t=920
Страница 2 из 3

Автор:  scuter [ 04 май 2014, 23:20 ]
Заголовок сообщения:  Re: Гугл подвел... Ищется функция scan2ascii...

Mirmik писал(а):
Как из защищенного режима выполнить перезагрузку?


да мне это тоже интересно,

есть варианты
1 - смотри ACPI
2 - переводи обратно в режим RM и выключай.

Автор:  Nable [ 05 май 2014, 01:15 ]
Заголовок сообщения:  Re: Гугл подвел... Ищется функция scan2ascii...

Mirmik писал(а):
Вопрос в догонку.

Как из защищенного режима выполнить перезагрузку?

Перезагрузиться просто:
1) если есть клавиатурный контроллер (8042) - через него можно
2) ещё можно triple-fault устроить
3) ещё можно посмотреть чего делает ключ параметр reboot=pci у линуха.
Вот выключать уже куда сложнее, нужно поддерживать ACPI.

Автор:  Himik [ 05 май 2014, 02:33 ]
Заголовок сообщения:  Re: Гугл подвел... Ищется функция scan2ascii...

Есть ещё системный порт 92h:
in al, 92h
or al, 1
out 92h, al

Я рекомендую выполнять цепочку процедур "перезагрузки", тоесть после этого способа сразу вызывать другой (с помощью порта клавиатуры) и т.д. пока комп не уйдёт в перезагрузку.

Автор:  Nable [ 05 май 2014, 02:57 ]
Заголовок сообщения:  Re: Гугл подвел... Ищется функция scan2ascii...

Himik писал(а):
Есть ещё системный порт 92h:
in al, 92h
or al, 1
out 92h, al

Я рекомендую выполнять цепочку процедур "перезагрузки", тоесть после этого способа сразу вызывать другой (с помощью порта клавиатуры) и т.д. пока комп не уйдёт в перезагрузку.
Где-то, может, и есть, но похоже что далеко не везде, а писать в нереализованные/нестандартные порты - идея плохая. Например, народ пишет что на машинах без 8042 попытка работы с портами 0x60/0x64 приводит к зависанию.
Но да, в случаях когда способов несколько - есть последовательности в которых способы лучше пробовать.
Касательно ребута: http://wiki.osdev.org/Reboot
Там и про выключение немного есть: http://wiki.osdev.org/Category:Power_management

Автор:  pavia [ 05 май 2014, 05:30 ]
Заголовок сообщения:  Re: Гугл подвел... Ищется функция scan2ascii...

Ну не знаю где автор строк нашёл машину без 8042 это нонценс!! И там явно уже специфичные вещи.
Но да способ этот устаревший. И насколько знаю МС от него давно отошла в сторону 92 порта.
Есть ещё PCI перезагрузка. Она более полная перезагружает почти все устройства компьютера.

Автор:  Mirmik [ 05 май 2014, 10:08 ]
Заголовок сообщения:  Re: Гугл подвел... Ищется функция scan2ascii...

А как перезагружаться правильно?...

Ну, например, как винда, или линух...

З.Ы. У некоего линуха нашел reboot.c, но там текста больно много...

Автор:  phantom-84 [ 05 май 2014, 10:12 ]
Заголовок сообщения:  Re: Гугл подвел... Ищется функция scan2ascii...

У меня сброс через клавиатурный контроллер – основной способ, через системный порт A – дополнительный. Для установки шлюза A20 аналогично. Проблем не наблюдал.

Mirmik, если вы еще не осилили ACPI, то мой способ вполне нормальный.

Автор:  Mirmik [ 05 май 2014, 12:06 ]
Заголовок сообщения:  Re: Гугл подвел... Ищется функция scan2ascii...

phantom-84 писал(а):
У меня сброс через клавиатурный контроллер – основной способ, через системный порт A – дополнительный. Для установки шлюза A20 аналогично. Проблем не наблюдал.

Mirmik, если вы еще не осилили ACPI, то мой способ вполне нормальный.



К... Но, наверное, ACPI всё же надо осилить...

Автор:  эмбрион [ 06 май 2014, 12:11 ]
Заголовок сообщения:  Re: Гугл подвел... Ищется функция scan2ascii...

Mirmik писал(а):
Не могу найти функцию scan2ascii...
Рекомендую познакомиться с готовыми ОС с открытым кодом. Есть вполне нормально документированные экземпляры - оттуда и можно содрать нужные функции. Ну или как минимум познакомиться с нормально работающим драйвером.

Автор:  Bargest [ 07 май 2014, 20:38 ]
Заголовок сообщения:  Re: Гугл подвел... Ищется функция scan2ascii...

У меня такой вариант (через ACPI):
Код:
;----------------------------------------------------------------
; Reboots computer
;----------------------------------------------------------------
RebootFunc:
; Old school:
;  mov al, 0xFE
;  out 0x64, al
;
; New school:
RESET_REG = 116       ; 12 bytes
RESET_VAL = 128       ;  1 byte

struc ResetRegStruc A
{
 virtual at A
  .SpaceID     db 0
  .BitWidth    db 0
  .BitOffset   db 0
  .AccessWidth db 0
  .Address     dq 0
 end virtual
}

ResetReg ResetRegStruc rdi

cli
  mov rdi, [FADTAddr] ; FADT from ACPI
  xor rax, rax
  mov  al, [rdi+RESET_VAL]   ; Load Reset Value
  add rdi, RESET_REG
  mov rdx, [ResetReg.Address]
  mov  cl, [ResetReg.SpaceID]

  cmp cl, 0                  ; Memory space
  jnz @f
   mov [rdx], al

  @@:
  cmp cl, 1                  ; IO space
  jnz @f
   out dx, al

  @@:                        ; PCI CFG Space
  cmp cl, 2
  jnz @f
   mov r14b, al              ; Value
   mov  ebx, edx
   shr  ebx, 24              ; Dev (ddddd)
   and   bl, 1Fh
   shl   bl, 3
   mov  eax, edx
   shr  eax, 16
   and   al, 7               ; Func (fff)
   or    bl, al              ; dddddfff
   shl   bx, 8               ; move to bh
   xor   ax, ax              ; Byte count and bus
   mov   bl, dl              ; Addr
   call PCIRegWrite
  @@:
jmp $

Страница 2 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/