Reboot eines PC



  • Hallo Leute,

    ich habe angenfangen meine Sourcecodes etwas aufzuarbeiten und besser zu kommentieren und bin bei der mach_reboot()-Funktion hängen geblieben. Im PrettyOS wird ja umständlich per Keyboard das Signal gesendet. Nun habe ich (zufällig) folgendes entdeckt:

    Some operating system kernels, such as Linux, still use triple faults as a last effort in their rebooting process if an ACPI reboot fails. This is done by setting the IDTR register to 0 and then issuing an interrupt. Since the table now has length 0, all attempts to access it fail and the processor generates a triple fault.

    aus Wikipedia, der freien Enzyklopädie (http://en.wikipedia.org/wiki/Triple_Fault)

    Nun habe ich das mal für meinen Kernel umgeschrieben:

    // `mach_reboot' uses the dirty method via a triple fault to reboot the system.
    void mach_reboot() {
            // 42 will reboot your system, why not?
            __asm volatile ("lidt 42");
            __asm volatile ("int $0x42");
    }
    

    Statt 42 kann man auch 0 nehmen 😉
    Denkt ihr, dass dies (für den Anfang) eine halbwegs gute Idee ist, so zu rebooten?

    Gruß,
    Christian

    PS: Wenn ihr wissen wollt, wieso ich __asm statt asm schreibe: das liegt daran, dass ich mit Visual Studio (xD) programmiere.



  • Bischen unsauber die Sache. Besser wäre wenn garantiert ist, daß die Bytes bei Adresse 42 (oder 0) auch wirklich null sind. Könnte sonst "undefiniertes Verhalten" geben.



  • Normal lädt man dazu die IDT mit Limit 0, dann weiß man ganz sicher, was passieren wird.


  • Mod

    http://www.pro-linux.de/news/1/17113/matthew-garrett-spass-mit-reboot.html
    Kernel-Entwickler Matthew Garrett hat sich mit der Kunst des Reboots eines PCs beschäftigt.

    Fünf Methoden, und keine funktioniert zuverlässig:

    - Die erste, klassische Methode zum Neustart führt über den Tastaturcontroller.
    - Die zweite klassische Methode ist die Auslösung einer Dreifachausnahme der CPU. Doch auch das führt mittlerweile, je nach CPU, nicht mehr zum erwarteten Ergebnis.
    - Die nächste Variante führt über den PCI-Bus. Durch das Schreiben eines speziellen Wertepaares sollte sich der Rechner zurücksetzen.
    - Die eine ist in den EFI-Laufzeit-Diensten enthalten und funktioniert laut Garret üblicherweise. Es wäre aber zuviel verlangt, ein unbedingtes Funktionieren zu erwarten.
    - Dann bleibt noch ACPI. Dieses stellt, wenn es neueren Versionen der Spezifikation folgt, eine Adresse und einen Wert zur Verfügung. Schreibt man den Wert in die angegebene Adresse, besteht immerhin die vage Möglichkeit, dass das System neu bootet.

    ... die Lösung kommt aus der Analyse des Ablaufs bei MS Windows:

    Vor diesem Hintergrund ist es nicht weiter verwunderlich, dass Linux manche Geräte nicht zum Reboot bewegen kann. Unter Windows scheint dies aber meist zu gehen, und so untersuchte Garrett mit Hilfe von Qemu, was Windows genau macht. Es stellte sich heraus, dass Windows sich nur auf ACPI und den Tastaturcontroller stützt. Ist im ACPI keine Angabe vorhanden, steuert es den Controller an, versucht es, wenn erfolglos, nach einem Moment noch einmal, und gibt dann auf. Ist die ACPI-Information vorhanden, schreibt Windows den Wert an die angegebene Stelle, betätigt dann den Tastaturcontroller, und wiederholt das, falls es bis dahin kommt, noch einmal.

    Da die BIOS-Entwickler im Wesentlichen für Windows programmieren, funktioniert diese Methode meist. Daher hat Garrett den Linux-Code für die kommende Version 3.0 entsprechend angepasst. Dadurch funktioniert der Reboot mit mehr Rechnern, beschleunigt den Neustart bei einigen anderen und vereinfacht den Reboot-Code.


Anmelden zum Antworten