Computer Neustarten und Runterfahren



  • Hi,

    ich hab mal bei google etwas rumgesucht und wahrscheinlich ne Funktion gefunden den PC auszuschalten, konnte se aber noch net ausprobieren, da ich grad keinen compiler für ASM in der nähe habe (laptop :D)

    Hier der code:

    ;=========================== Reboot ============================ 
    
    GLOBAL _Reboot ;Die "Funktion" 
    _Reboot: 
    
    db 0EAh  ;entspr. jmp FFFF:0000
    dw 0000h 
    dw 0FFFFh 
    
    ;=========================== Shutdown ============================ 
    
    GLOBAL _Shutdown ;Die "Funktion" 
    _Shutdown: 
    mov ax,5301h ;Aktiviere RealMode APM Interface
    xor bx,bx 
    int 15h
    
    mov ax,530eh ;Waehle APM Version
    xor bx,bx 
    mov cx,0102h ;v1.2
    int 15h
    
    mov ax,530fh ;Aktiviere APM fuer alle Geraete
    mov bx,0001h ;ID 1=Alle Geraete
    mov cx,0001h ;1=engage
    int 15h
    
    mov ax,5308h ;Aktiviere automatisches APM fuer alle Geraete
    mov bx,0001h ;ID 1=Alle Geraete
    mov cx,0001h ;1=enable
    int 15h
    
    mov ax,5307h ;Setze Geraetezustand
    mov bx,0001h ;ID 1=Alle Geraete
    mov cx,0003h ;Status 3=Ausgeschaltet
    int 15h
    

    Kann die mal einer testen? 🙄 Hier im Forum gabs ja noch keine funktion zu diesem Thema sofern wie ich mich erinnere 🙂

    Anm:
    Die hier aufgefuehrten Routinen funktionieren nur im RealMode (zB. DOS) und sind nur als kleiner Denkanstoss gedacht.
    Danke an den Autor.

    Edit:
    -Kommentare hinzugefuegt und Pascal-artige $hex-Schreibweise umgeaendert.
    -Fehler ausgebuegelt (v1.0/1.2 - thx an mwoidt)



  • Dieser Thread wurde von Moderator/in Nobuo T aus dem Forum FAQ - Assembler in das Forum Projekt: OS-Development verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Im PM geht zumindest der Reboot über den Tastaturcontroller:

    *(unsigned short*) 0x472 = 0x1234;    // Setzen des reboot modus. 0x1234: Warm boot ohne Speichertest, 0x0: Cold boot mit Speichertest
    outb(0x64, 0xFE);    // Sende 0xFE (Reboot) an das Steuerregister des Tastaturcontrollers 0x64
    

    Man kann wohl auch in den RM zurückschalten und ins Bios springen. Klingt aber für mich nicht wie eine schöne Lösung.

    Beim Shutdown weiß ich leider nichts.


  • Mod

    Würde das Sinn machen eine Instruktion 'reboot' in die shell aufzunehmen und einen entprechenden syscall zu setzen? Warm Boots mache ich öfters beim Testen.



  • Tobiking2 schrieb:

    Im PM geht zumindest der Reboot über den Tastaturcontroller

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


  • 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

    ..


Anmelden zum Antworten