Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Programm Noob 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.
(http://img163.imageshack.us/img163/1476/fehleru.th.png) (http://img163.imageshack.us/i/fehleru.png/)
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
-
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.
-
Um das ganze per ACPI im ProtectedMode zu machen, siehe hier:
http://forum.osdev.org/viewtopic.php?t=16990
-
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
-
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).
-
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
-
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
-
also A20 gate deaktivieren gdt und idet löschen in anderen Speicherbereich springen, hab ich danicht noch was vergessen??
Programm Noob
-
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.
-
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
-
Hat von euch einer diesen Code am laufen?
Ja, ich.
-
@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
-
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)
-
Ich glaube mein Problem bestand darin, das ich erst acpi Enable und dann init_acpi ausgeführt habe.
-
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?
-
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
-
Im Wiki (http://www.lowlevel.eu/wiki/ACPI) ist u.a. ein Link zur Spezifikation.
-
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
-
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