Autor Thema: [Erledigt] PC ausschalten nicht neustarten!!  (Gelesen 6410 mal)

Programm Noob

  • Gast
Gespeichert
« am: 07. December 2009, 12:51 »
Moin

ich bin gerade dabei meinem OS eine Funktion zu geben, damit es den PC ausschalten kann, doch es ändert sich nur die hintergrundfarbe und bochs startet neu, Virtual Box läuft einfach weiter.



Das ist der Code ausm asm kernel, welcher den cpp Kernel aufruft und danach in eine entlosschleife geht.
global loader ; Entrypoint
extern _main ; Main aus dem C++ Kernel
; TODO extern destructors
extern _initialiseConstructors
 
FLAGS    equ 0
MAGIC    equ 0x1BADB002       ; Magicnumber
CHECKSUM equ -(MAGIC + FLAGS) ; Checksum
 
section .text
align 4
MultiBootHeader:
dd MAGIC       ; Magic number
dd FLAGS       ; Flags
dd CHECKSUM     ; Checksum
 
loader:
mov esp,0x200000
push eax        
push ebx        
call _initialiseConstructors  
call _main       ; main aufrufen
call powerdown

 
stop:
jmp stop
  
powerdown:
MOV AX,0x5300
XOR BX,BX
INT 0x15 ; APM install check
MOV AX,0x5304
XOR BX, BX
INT 0x15 ; disconnect interface
MOV AX,0x5301
XOR BX, BX
INT 0x15 ; connect real-mode interface
MOV AX,0x5307
MOV BX,1
MOV CX,3
INT 0x15 ; powerdown system

Das ist das APM beispiel aus Ausgabe 3.

Wisst ihr woran das ligen kann?

Programm Noob
« Letzte Änderung: 12. August 2010, 20:31 von Programm Noob »

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 07. December 2009, 13:16 »
Wisst ihr woran das ligen kann?

Das ist Code für den Real Mode, weil die BIOS-Interrupts verwendet werden. Im Protected Mode hast du keinen Zugriff auf die BIOS interrupts.
Dieser Text wird unter jedem Beitrag angezeigt.

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #2 am: 07. December 2009, 14:24 »
Um das ganze per ACPI im ProtectedMode zu machen, siehe hier:
http://forum.osdev.org/viewtopic.php?t=16990

Programm Noob

  • Gast
Gespeichert
« Antwort #3 am: 07. December 2009, 15:14 »
Ups ich habe vergessen zu erwähnen, das mein Laptop ausgeht, wenn ich mein OS boote. man sihet für sekundenbruchteile ein grünes Fenster und dann ist es aus. Nur die Emulatoren scheinen das nicht zu verstehen.

Programm Noob

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #4 am: 07. December 2009, 16:04 »
Das ist auch richtig so. Ich frage mich, wie dein Laptop da ausgehen kann, das erzeugt zwangsläufig einen Triple Fault (es sei denn, dein Exceptionhandler für die Exception 0x15 hat einen kompletten ACPI-Treiber und schaltet dann aus), weil du im Protected Mode nunmal erstens keine BIOS-Interrupts zur Verfügung hast und zweitens den Code auch gar nicht ausführen könntest (weil das Code für Real Mode ist).

Programm Noob

  • Gast
Gespeichert
« Antwort #5 am: 08. December 2009, 20:37 »
Moin

ich habe mir jetzt überlegt, dass ich wenn der c++ kernel beendet ist der asm kernel in den RM schaltet und dann die APM funktion aufruft.

Müsste doch so Funktionieren oder?

Nur wie schaltet man in den RM?

Programm Noob

chris12

  • Beiträge: 134
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 08. December 2009, 20:48 »
in dem du die aktivierung des pm wieder rückgängig machst.
also wie ich das verstanden hab, musst du genau das entgegen gesetzte tun als wenn du den pm aktivierst.

alle angaben ohne gewähr
OS? Pah! Zuerst die CPU, dann die Plattform und _dann_ das OS!

Programm Noob

  • Gast
Gespeichert
« Antwort #7 am: 08. December 2009, 20:50 »
also A20 gate deaktivieren gdt und idet löschen in anderen Speicherbereich springen, hab ich danicht noch was vergessen??

Programm Noob

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #8 am: 08. December 2009, 20:57 »
A20-Gate musst du nicht deaktivieren. Siehe dazu hier: http://lowlevel.brainsware.org/forum/index.php?topic=2347.msg26548#msg26548 (Ich glaube, das wird noch öfter gebraucht :-D).

Nichtsdestotrotz weise ich auf den verlinkten ACPI-Code hin, der mir wesentlich sauberer erscheint.

Programm Noob

  • Gast
Gespeichert
« Antwort #9 am: 11. August 2010, 21:16 »
Wegen dem altem Thema nicht meckern. Ich habe es mir aus gutem Grund rausgesucht.

Ich habe vorhin versucht den ACPI code den XanClic damals netterweiße verlinkt hat in NandOS ein zu bauen. Ich habe den Code eigentlich unverändert übernommen zum testen, nur die variablen typen habe ich mit typedef bekannt gemacht und die Bildschirm ausgabe funktion umbenannt zu kprintf. Leider bringt mir die Bildshirmausgabe nichts denn sobalt ich den Code versuche zu benutzen, startet Bochs und alle Testrechner neu. Auch wenn ich in allen Exceptions ne RS232Ausgabe platziere, kommt dort nichts an. Das soll heißen, das es kein Triple Foult sein kann, da ixh kein Double Foult bekomme.

Hat von euch einer diesen Code am laufen?

Code kann ich euch morgen geben. Komme momentan nicht an Computer.(Ich schreibe gerade am Handy, nicht das ihr euch wundert.)

Programm Noob

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #10 am: 11. August 2010, 21:41 »
Hat von euch einer diesen Code am laufen?
Ja, ich.

Programm Noob

  • Gast
Gespeichert
« Antwort #11 am: 11. August 2010, 21:56 »
@XanClic und alle anderen, die diesen Code erfolgreich verwenden: Habt ihr irgendetwas verändert, in welcher reihenfolge ruft ihr die Funktionen auf, vielleicht liegt da ja men Problem?

Programm Noob

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #12 am: 12. August 2010, 09:20 »
Verändert habe ich iirc recht wenig, nur soviel, dass es mit Paging funktioniert.

Beim Initialisieren des Systems führe ich folgenden Code aus:
if (!init_acpi())
    acpi_enable();

Und fürs Ausschalten dann
acpi_power_off();
(wobei man sich das acpi_enable() wohl auch sparen könnte)

Programm Noob

  • Gast
Gespeichert
« Antwort #13 am: 12. August 2010, 13:55 »
Ich glaube mein Problem bestand darin, das ich erst acpi Enable und dann init_acpi ausgeführt habe.

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 12. August 2010, 15:13 »
Kein schlechtes Gefühl dabei, wenn du den Code einfach so übernimmst und scheinbar nicht mal wirklich weißt was init_acpi und acpi_enable tun um die Funktionen richtig aufrufen zu können?
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Programm Noob

  • Gast
Gespeichert
« Antwort #15 am: 12. August 2010, 15:45 »
Moin

Ein schlechtes Gefühl habe ich nicht , da Ich das alles selber programmieren will. Trotzdem wollte ich einfach den Code der damals nicht wollte nochmal testen.

Kennt einer gute Tuts oder sonstige Links, die einem Beim verstehen und programmieren eines ACPI Treibers helfen können?

Programm Noob

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 12. August 2010, 15:52 »
Im Wiki ist u.a. ein Link zur Spezifikation.
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Programm Noob

  • Gast
Gespeichert
« Antwort #17 am: 12. August 2010, 15:59 »
die Spec habe ich mir angesehen aber die find ich extrem unübersichtlich und schwer verständlich. Tuts sind meist leicher zu verstehen.

Programm Noob

Programm Noob

  • Gast
Gespeichert
« Antwort #18 am: 12. August 2010, 20:30 »
Moin

Ich hab mich jetzt überACPI informiert, ich habe dazujetzt ein paar fragen und es werden sicherlich noch mehr deshalberkläre ich dieses Thema als erledigt und eröffne ein neues Thema.

Programm Noob

 

Einloggen