Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[ASM] Gorący restart w trybie chronionym

Ostatnio zmodyfikowano 2013-06-28 00:13
Autor Wiadomość
Brezniew
Temat założony przez niniejszego użytkownika
[ASM] Gorący restart w trybie chronionym
» 2013-06-26 20:02:59
Witam.
Pisząc system operacyjny na samym jego początku w pamięci jako pierwszy adres IP funkcje restartującą komputer a za nią adres funkcji głównego kodu kernela systemu w c.

...
jmp _1
_1:
EXTERN start_kernel
push dword reboot
push dword start_kernel
ret ;skok do start_kernel
...

Mam problem z napisaniem funkcji reboot którą w trybie rzeczywistym napisałbym tak:

...
reboot:
mov bx, 40h
mov ds, bx
mov word [ds:72h], 1234h ;ustawienie gorącego restartu
jmp 0FFFFh:0000h ;skok początku kodu biosa bios-a
...

Chyba jest oczywiste to dlaczego taki kod nie zadziała w trybie chroniony.
P-86259
Elaine
» 2013-06-26 20:20:53
Odczytaj z tablic ACPI informacje o rejestrze resetującym — jego typ, rozmiar, adres i wartość, którą należy do niego wpisać.

Nie ma w FADT takich informacji lub nie chce ci się implementować obsługi ACPI i PCI? Ustaw IDT o limicie 0 i wywołaj przerwanie, czego skutkiem będzie triple fault i reset CPU.
P-86265
Brezniew
Temat założony przez niniejszego użytkownika
» 2013-06-26 20:39:27
Przy wykorzystaniu metody triple fault przy użyciu błędnego IDT ale dochodzi do zimnego restartu, ale myślałem też o ponownym przełączeniu procesora w tryb rzeczywisty bo po prostu ustawieni gorącego restartu i skok pod adres bios-a może wywołać inne komplikacje a bios pracuje przecież w trybie rzeczywistym i jest kodem 16-bitowym. Co do przełączania trybu procesora to chyba nie wystarczy sama zmiana flagi w rejestrze cr0, nie wiem czy nie trzeba będzie zablokować linię A20.
P-86274
Elaine
» 2013-06-26 22:23:28
Jeśli chodzi o soft reboot bez pomocy BIOSu, to musiałbyś ustawić wszystkie urządzenia do stanu pierwotnego. Nie mając sterowników do każdego urządzenia (wliczając np. chipset mobo!) trudno to zrobić.

Wyjść do trybu rzeczywistego w teorii można, ale w praktyce nie zawsze to spowoduje, że znowu można używać wywołań BIOSu, bo na przykład w międzyczasie twój sterownik USB zainicjalizował kontroler, wyłączając emulację klawiatury PS/2 w firmware, kiedy kod BIOSu oczekuje jej włączonej.

Dla uniknięcia problemów lepiej zrobić hard reboot.

Chyba, że chodzi o soft reboot w znaczeniu reinicjalizacji jądra, ale wtedy implementacja zależy od konstrukcji kernela.
P-86314
Brezniew
Temat założony przez niniejszego użytkownika
» 2013-06-27 18:35:26
A jak wykonać taki hard reboot.
P-86388
pekfos
» 2013-06-27 19:08:24
Tak samo jak zimny restart, bo to jedno i to samo.
P-86390
DejaVu
» 2013-06-28 00:13:02
Jeden temat = jeden problem. Zamykam.
P-86417
« 1 »
  Strona 1 z 1