Computer Neustarten und Runterfahren


  • Mod

    Am allereinfachsten geht es im PM eigentlich, indem man einen Triple Fault provoziert.

    Ja, das ist ein amüsanter Weg. Was schlägst Du da als konkrete, sicher wirkende Methode vor?



  • http://en.wikipedia.org/wiki/Triple_fault schrieb:

    Some operating system kernels, such as Linux, use triple faults as a last effort in their rebooting process. 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. Note that this is not the preferred method of restarting the computer. In Linux, using the ACPI is tried first.



  • Zum Ausschalten im PM könnte man sich das hier anschauen:
    http://forum.osdev.org/viewtopic.php?f=1&t=16990&p=126715


  • Mod

    void reboot()
    {
    	int32_t temp; // A temporary int for storing keyboard info. The keyboard is used to reboot
        do //flush the keyboard controller
        {
           temp = inportb( 0x64 );
           if( temp & 1 )
             inportb( 0x60 );
        }
    	while ( temp & 2 );
    
        // Reboot
        outportb(0x64, 0xFE);
    }
    

    Diese Funktion steht im kernel in util.c, wurde bisher aber noch nicht getestet.



  • Darüber sollte noch mal diskutiert werden: "Reboot"-Fähigkeit des OS ist ein schwerer Designfehler. Ein OS sollte alles denkbare zur Laufzeit regeln können (Reboot != Ausschalten). 🙂



  • +gjm+ schrieb:

    Darüber sollte noch mal diskutiert werden: "Reboot"-Fähigkeit des OS ist ein schwerer Designfehler. Ein OS sollte alles denkbare zur Laufzeit regeln können (Reboot != Ausschalten). 🙂

    Es kommt darauf an wozu man den Reboot benutzt. Ich wüsste nicht was gegen einen Reboot spricht, wenn man mehrere Betriebsysteme installiert hat, und von einem auf das andere wechselt.

    Woran du denkst ist warscheinlich sowas wie ein Kernel Update ohne dabei rebooten zu müssen. Das liegt aber noch weit in der Zukunft. Solange man unter PrettyOS gar keinen neuen Kernel bauen kann, braucht man sich nicht Gedanken darüber machen wie man ihn dann einspielt.



  • +gjm+ schrieb:

    (Reboot != Ausschalten)

    Diese reboot()-Funktion entspricht schon einem Ausschalten, also mindestens einem CPU-Reset.

    Falls du meintest, dass Reboot eigentlich das erneute Starten des entsprechenden Betriebssystems ist.



  • Tobiking2 schrieb:

    Ich wüsste nicht was gegen einen Reboot spricht, wenn man mehrere Betriebsysteme installiert hat, und von einem auf das andere wechselt.

    Aber je nachdem, ob (und was) ein Betriebssystem beim reboot ins Offset 0x0F (CMOS Shutdown Status) vom CMOS schreibt, kann das "Bootmedium" beim (Wieder)Hochfahren übergangen werden. Einige Betriebssysteme machen es z.B. um das Wiederhochfahren zu beschleunigen. Dann hilft eh nur noch Aus- und Einschalten des Rechners.

    Ursprünglich ist ein reboot (reset) nicht dazu gedacht, um Betriebssysteme wechseln zu können. Wenn ein OS-Wechsel via reboot funktioniert, dann ist das eher ein glücklicher Zufall. Darum sollte PrettyOS ein reboot gar nicht erst implementiert kriegen. Es ist schlicht und einfach "sinnfrei". 🙂



  • +gjm+ schrieb:

    Aber je nachdem, ob (und was) ein Betriebssystem beim reboot ins Offset 0x0F (CMOS Shutdown Status) vom CMOS schreibt, kann das "Bootmedium" beim (Wieder)Hochfahren übergangen werden. Einige Betriebssysteme machen es z.B. um das Wiederhochfahren zu beschleunigen. Dann hilft eh nur noch Aus- und Einschalten des Rechners.

    Ursprünglich ist ein reboot (reset) nicht dazu gedacht, um Betriebssysteme wechseln zu können. Wenn ein OS-Wechsel via reboot funktioniert, dann ist das eher ein glücklicher Zufall. Darum sollte PrettyOS ein reboot gar nicht erst implementiert kriegen. Es ist schlicht und einfach "sinnfrei". 🙂

    Und wie wechselt man dann sinnvollerweise von PrettyOS nach Windows?



  • Ein Neustarten des Computers und des Betriebssystems durch einen Reboot als sinnfrei zu bezeichnen ist, naja, amüsant. Zudem kenne ich kein Betriebssystem, was auf die Weise, wie du sie schlidest +gjm+ rebooted (wenn man von Techniken wie Supsend-to-RAM und Suspend-to-Disk einmal absieht).



  • DerHartmut schrieb:

    Zudem kenne ich kein Betriebssystem, was auf die Weise, wie du sie schlidest +gjm+ rebooted

    Es wird wohl nicht auf die beschriebene Weise funktionieren, aber ich kann hier bei Linux (openSUSE 11.1/KDE 3.5) einen Reboot durchführen, nach dem ein vorher festgelegtes Betriebssystem (aus dem GRUB-Menü) gestartet wird.

    +gjm+ schrieb:

    Wenn ein OS-Wechsel via reboot funktioniert, dann ist das eher ein glücklicher Zufall.

    Nein, ist es nicht. Sieh dir den Code an. Der schickt 0xFE zum I/O-Port 0x64, dies resultiert in einem CPU-Reset. Das ist kein glücklicher Zufall, das ist das, was der Code will.



  • XanClic schrieb:

    +gjm+ schrieb:

    Wenn ein OS-Wechsel via reboot funktioniert, dann ist das eher ein glücklicher Zufall.

    Nein, ist es nicht. Sieh dir den Code an. Der schickt 0xFE zum I/O-Port 0x64, dies resultiert in einem CPU-Reset.

    Aber was passiert dann?

    Die CPU ist im Realmode und fängt an, Code (das BIOS) an Adresse F000:FFF0 auszuführen. Genau wie beim Einschalten des Rechners. Nur eben, daß das BIOS erst den CMOS Shutdown Status prüft, bevor dann der Code des "Bootdevice" eventuell geladen und ausgeführt wird. Beim Einschalten des Rechners ist der Shutdown Status immer 0. Das ist so (hardwareverdrahtet) definiert. Aber beim Reboot ist er das, was das Betriebssystem reingeschrieben hat. Was heißt, bei Windows z.B. ==undokumentiert==. 😞



  • OK, da muss ich dir Recht geben.

    Ich bezweifle aber, dass heutige Betriebssysteme das wirklich nutzen. Und so wie ich das sehe, sollte folgender Code reichen, um ein normales Reset durchzuführen:

    outb(0x70, (inb(0x70) & 0x80) | 0x0F);
    outb(0x71, 0);
    

    Und danach dann eben outb(0x64, 0xFE); oder was auch immer.

    Aber ich muss dir trotzdem widersprechen, dass ein Reboot nicht dazu gedacht ist, andere Betriebssysteme zu starten. Nur, weil es bei der Windowsoption "Neu Starten" im Tooltip "Den Computer herunterfahren und Windows neu starten" heißt, ist das eher ein Verweis auf die Monopolstellung von Windows als auf die Möglichkeit, andere Betriebssysteme zu starten.

    btw: Es wäre wohl trotzdem nicht reine Glückssache. So wie ich dich verstanden habe, werden die Shutdowncodes > 3 nur für den direkten Start in das eigene Betriebssystem verwendet. Damit kann PrettyOS also nicht gestartet werden. Und nach einem kompletten Reset (also mit POST, etc.) oder einem normalen Start (nachdem der Computer aus war) steht ja 0 bis 3 drin, was wieder zu einem kompletten Reset führt. 😃



  • Ich hoffe ehenkes lässt sich durch solche unsinnigen Diskussionen nicht in seinem Ziel (Weltherrschaft oder so) beirren.


  • Mod

    ..



  • Erhard Henkes schrieb:

    Weltherrschaft oder so

    Das war Bill Gates, und selbst der hat nun Linux und Sonstiges am Hals. 😃

    Welche OS haben denn überhaupt einen reboot-Befehl? Sollte es keine namhaften geben, dann verschwindet dieses "utility" eben aus der Datei util.c.

    Windows hat shutdown -r
    Linux hat reboot
    Windows hat ExitWindowsEx(EWX_REBOOT,
    Linux hat reboot(LINUX_REBOOT_CMD_RESTART)


  • Mod

    Danke für den Hinweis!
    http://msdn.microsoft.com/en-us/library/bb416523.aspx

    EWX_REBOOT - Shuts down the system and reboots the device.

    siehe auch: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39051.html



  • +gjm+ schrieb:

    Nur eben, daß das BIOS erst den CMOS Shutdown Status prüft, bevor dann der Code des "Bootdevice" eventuell geladen und ausgeführt wird. Beim Einschalten des Rechners ist der Shutdown Status immer 0. Das ist so (hardwareverdrahtet) definiert. Aber beim Reboot ist er das, was das Betriebssystem reingeschrieben hat. Was heißt, bei Windows z.B. ==undokumentiert==. 😞

    Aber wenn der PrettyOS-Reboot-Code läuft, ist ja zum Glück kein Windows, sondern ein PrettyOS aktiv und hat es selbst in der Hand. 🙂


  • Mod

    Man könnte den Reboot versuchsweise auf Strg + Alt + Entf oder innovativ auf Shift + AltGr + r legen. 😉

    XanClic hat ja erwähnt, wie man zur Sicherheit eine 0 ins entsprechende CMOS-Register schreibt.


Anmelden zum Antworten