Autor Thema: Einen PC neustarten  (Gelesen 6689 mal)

bscreator

  • Gast
Gespeichert
« am: 23. February 2010, 15:23 »
Hallo,

1.
soviel ich weiss, kann man mit
db 0EAh
dw 0000h
dw 0FFFFh
einen Computer neustarten. Aber was genau machen die 3 Befehle ?
Die schreiben doch nur ein Byte und 2 Words in den Speicher, oder ?

2.
Wenn man auf einem 8086 eigene Interrupts wie in LowLevel-Ausgabe 3 erstellen möchte, sind das alles nur Software-Interrupts. Hardware-Interrupts in der IVT (z.B. int 0x10, int 0x16) kann man nicht verändern, oder ?

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 23. February 2010, 15:34 »
Zu 2.: Warum sollte das nicht geben? Irgendwo muss deine Serviceroutine doch liegen, und deren Adresse gibst du an. Den Interrupt selbst stellst du ja nicht um, nur die Einsprungadresse der ISR.

Zu 3.: Was die genau tun, weiß ich nicht. Aber wenn du mitten in den Source solche Befehle reinschreibst, dann sind die auch im Code so drin und werden ausgeführt. In dem Fall also 5 Bytes - was die tun, kann jemand schreiben, der die auch dekodieren kann. :-)

Gruß,
Svenska

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 23. February 2010, 15:53 »
1.
soviel ich weiss, kann man mit
db 0EAh
dw 0000h
dw 0FFFFh
einen Computer neustarten. Aber was genau machen die 3 Befehle ?
Die schreiben doch nur ein Byte und 2 Words in den Speicher, oder ?
Diese 5 Bytes sind der Maschinencode für den Befehl JMP 0xFFFF:0x0000. An der Adresse FFFF:0000 bzw. physisch FFFF0 liegt der Einsprungspunkt des BIOS, zu dem die CPU beim Systemstart anfängt den Code auszuführen. Du springst damit praktisch zu den Initialisierungsroutinen des BIOS.
Dieser Text wird unter jedem Beitrag angezeigt.

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #3 am: 23. February 2010, 16:28 »
2.
Wenn man auf einem 8086 eigene Interrupts wie in LowLevel-Ausgabe 3 erstellen möchte, sind das alles nur Software-Interrupts. Hardware-Interrupts in der IVT (z.B. int 0x10, int 0x16) kann man nicht verändern, oder ?
Soweit ich sehe, sind das kein Hardware- sondern BIOS-Interrupts. Und wie Svenska schon sagt, kann man alle Interrupthandler umbiegen - gerade bei BIOS-Interrupts ist aber die Frage, ob man das will.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 23. February 2010, 17:43 »
Och, das kann schon vorkommen. Man speichert dann halt den Originalwert und ruft in seinem ISR den passenden BIOS-Code auf (oder was auch immer davor drinstand), nachdem man seine Schweinereien gemacht hat.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 23. February 2010, 18:43 »
Wie es mit TSR-Programmen unter DOS üblich ist (die sich oft per Tastatur- oder Timerinterrupt selbst aufrufen). Außerdem kann man auf diese Weise gewisse BIOS-Funktionen auch ersetzen (z.B. den int 0x10, wenn man die Grafikkarte besser kennt als das BIOS) oder DOS erweitern.

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #6 am: 23. February 2010, 18:59 »
Hm, aber wenn man sowas macht, gibt es für mich persönlich keinen Grund mehr, im Real Mode zu bleiben. :-D

bscreator

  • Gast
Gespeichert
« Antwort #7 am: 23. February 2010, 20:55 »
Zitat
Diese 5 Bytes sind der Maschinencode für den Befehl JMP 0xFFFF:0x0000. An der Adresse FFFF:0000 bzw. physisch FFFF0 liegt der Einsprungspunkt des BIOS, zu dem die CPU beim Systemstart anfängt den Code auszuführen. Du springst damit praktisch zu den Initialisierungsroutinen des BIOS.
Kennt jemand von euch dann auch den Einsprungspunkt um den PC herunterzufahren (vielleicht FFFF:FFFF) ?

Zitat
Hm, aber wenn man sowas macht, gibt es für mich persönlich keinen Grund mehr, im Real Mode zu bleiben.
Das sehen etliche Leute so. Aber ich will mich erst im Real-Mode gut auskennen, bevor ich im PM mein Unwesen treibe.


PS : Danke für eure zahlreichen Beiträge

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 23. February 2010, 22:07 »
Zitat
Diese 5 Bytes sind der Maschinencode für den Befehl JMP 0xFFFF:0x0000. An der Adresse FFFF:0000 bzw. physisch FFFF0 liegt der Einsprungspunkt des BIOS, zu dem die CPU beim Systemstart anfängt den Code auszuführen. Du springst damit praktisch zu den Initialisierungsroutinen des BIOS.
Kennt jemand von euch dann auch den Einsprungspunkt um den PC herunterzufahren (vielleicht FFFF:FFFF) ?
Dass dieser konkrete Einsprungspunkt FFFF:0000 existiert, ist etwas, das auf die CPU zurückzuführen ist, weil sie ja irgendwo anfangen muss. Wann sie aufhört, wurde im Jahre 1979 noch vom Netzschalter extern geregelt.

Hier könntest du anfangen, wenn du den PC herunterfahren willst:
-> http://wiki.osdev.org/Shutdown
-> http://wiki.osdev.org/APM
-> http://www.ctyme.com/intr/rb-1401.htm
Dieser Text wird unter jedem Beitrag angezeigt.

blitzmaster

  • Beiträge: 77
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 24. February 2010, 20:08 »
Man kann einen Neustart auch mit einem provozierten Tripe Fault erzwingen.
A / OS PM - THE operating system of the future

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 24. February 2010, 21:53 »
Auf die Weise hat OS/2 1.x die DOS-Box auf dem 286er erzeugt. (Der 286er kann nicht vom Protected Mode in den Real Mode zurückschalten.)

Daran scheiter(te)n die meisten Emulatoren. Lass es lieber sein.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 24. February 2010, 22:15 »
Neustart per Triple Fault ist nicht so unüblich und sollte auch in Emulatoren funktionieren. Wobei es im RM wohl eher schwer ist, einen zu erzeugen.

Der Trick beim 286er dagegen funktioniert eher nicht. Ich glaube auch nicht, dass man den heute noch braucht, aber es kann nicht schaden, ihn zu kennen - als ein Beispiel kreativen Missbrauchs von Mechanismen. ;)

Kurz zur Erläuterung, einige kennen den Trick vermutlich nicht (und im Detail bin ich mir selbst nicht hundertprozentig sicher): Beim 286er kann man wie gesagt nur einmal in den PM schalten, zurück geht dann nicht mehr. Aber um die DOS-Programme ausführen zu können, muss man zurück. Die einzige Möglichkeit, die bleibt, in den RM zurückzukommen ist durch einen CPU-Reset. Vorher gibt man dem BIOS noch den Einsprungspunkt, an dem es weitermachen soll, damit kein "richtiger" Reboot gemacht wird. Für den Reset selbst funktionieren dann wie normal auch mehrere Möglichkeiten, z.B. der Tastaturcontroller, aber Triple Fault performt am besten.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen