Autor Thema: Fragen zum P-Mode und der IDT  (Gelesen 4138 mal)

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« am: 30. October 2005, 19:50 »
1.) Muss man die IDT vor oder nach dem Einschalten des PM definieren?
2.) Wie kann man einige Interrupts maskieren ?
3.) Wie kann ich von z.B eax die oberen 16 Bits und die unteren 16 Bits trennen. Wie bei ax, al und ah.
4.) Wo lege ich den Stack am besten fest, wenn mein Kernel auf 0x10000 ist.
5.) Wie erstelle ich am einfachsten einen Handler für Exeption 13 (Genral Protection Fault) ?

Gruss
Noooooooooos

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #1 am: 30. October 2005, 20:47 »
1.) Muss man die IDT vor oder nach dem Einschalten des PM definieren?
Nein, solange du mit keinen Interrupts rechnest, ansonsten schmiert dir alles ab. Ich würds aber machen, falls eine Exception kommt.

3.) Wie kann ich von z.B eax die oberen 16 Bits und die unteren 16 Bits trennen. Wie bei ax, al und ah.
Du kannst ror (Rotate Right) benutzen (oder auch die left-Version):
mov eax,0xFFFF0000 // ax=0x0000
ror eax,0x10 // ax=0xFFFF
ror eax,0x10 // ax=0x0000

Funktioniert wie Schieben, nur dass die Bits auf der anderen Seite wieder rein kommen.

5.) Wie erstelle ich am einfachsten einen Handler für Exeption 13 (Genral Protection Fault) ?
Kommt drauf an, was er handeln soll. Meine ersten Hanlder haben nur zB "e13" ausgegeben und sich dann in eine Endlosschleife begeben.

MM

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 30. October 2005, 21:44 »
Zitat von: nooooooooos
4.) Wo lege ich den Stack am besten fest, wenn mein Kernel auf 0x10000 ist.


Also es gibt keine beste Lösung. Den Kernelstack lege ich persönlich direkt vor das Video-RAM, also ab 0xa0000 abwärts. Andere legen ihn aber auch ans Ende des Hauptspeichers, das ist auch eine recht elegante Methode, weil man dann sehr viel vorhalten muss. Allerdings ist dann auch die Gefahr gegeben, mit ihm unbemerkt andere Daten zu überschreiben.

Geschmacksache...

Wenn du ohnehin keine großen Verschachtelungen im Kernel verwendest kannst du ihn natürlich auch ab 0x10000 abwärts halten.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 31. October 2005, 06:33 »
So jetzt nochmals die noch offenen Fragen:

A.)Angenommen, ich bin so weit, dass ich eine IDT erstellen möchte, definiere ich die IDT besser vor oder nach nach dem einschalten des PM?

B.)Wie kann ich einen Interrupt (z.B Timer Interrupt) maskieren. Ich hab das schon ein paar mal gelesen und frage mich, wie man einen Interrupt ausschalten kann?

C.) Wie kann ich Exeption 13 (General Protection Fault) abfangen, so dass ich mit meinem Programm weiter machen kann?

Grusss
Nooooooooos

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #4 am: 31. October 2005, 07:33 »
Zitat von: nooooooooos
B.)Wie kann ich einen Interrupt (z.B Timer Interrupt) maskieren. Ich hab das schon ein paar mal gelesen und frage mich, wie man einen Interrupt ausschalten kann?
Also mit den Befehl cli werden alle interrupt deaktiviert und mit sti alle wieder aktiviert. Wenn du die IRQ's deaktivieren willst dann musst du die Ports 21h für Master PIC und A1h für Slave PIC nutzen. Wenn du das Bit setzt dann ist der IRQ maskiert sprich deaktiviert. Hier mal ein Beispiel:

Du möchtest den IRQ1 (Tastatur) deaktivieren aber alle anderen aktivieren:

mov al,00000010b ;set bit 1 in Port 21h
out 21h,al
xor al,al
out A1h,al

Das heißt die IRQ's 0-7 kannst du mit 21h ansprechen und die IRQ's 8-15 mit dem A1h. Müsste so funktionieren. Habe das jetzt nicht getestet aber bin mir eigentlich sicher das das richtig ist.
In the Future everyone will need OS-64!!!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 31. October 2005, 11:26 »
Zitat von: nooooooooos
A.)Angenommen, ich bin so weit, dass ich eine IDT erstellen möchte, definiere ich die IDT besser vor oder nach nach dem einschalten des PM?


Danach. Ein linearer(er) Adressraum ist nämlich sehr praktisch.

Zitat
C.) Wie kann ich Exeption 13 (General Protection Fault) abfangen, so dass ich mit meinem Programm weiter machen kann?

Gar nicht.
Ein GPF kann durch alles mögliche entstehen. Irgendwie musst du also rausfinden, was passiert ist. Das ist mMn schon mal nicht möglich.
Und selbst wenn du herausbekommen hast, was die Ursache für einen GPF ist, was willst du dann tun? Wenn zum Beispiel ein ungültiger Befehl ausgeführt wurde oder ein ungültiger Speicher adressiert wurde (oder was auch immer einen GPF auslöst), willst du dann diesen Befehl korrigieren oder überspringen? Was wenn das Programm danach nicht mehr konsistent ist. Folgendes Programm mal als Beispiel:
mov dword [foo], 0x12345678
mov eax, [foo]
mov ebx, [eax] ; <--- das löst einen GPF aus
;...
; daten:
foo dd 0

macht. Willst du dann den Befehl überspringen? Was machst du wenn das Programm aber den wert in ebx unbedingt braucht? Änderst du dann eax oder ebx? Und was machst du mit [foo]? Wenn das Programm z.B. gerade in einer Schleife ist, willst du dann, dass der Fehler nochmal passiert oder änderst du [foo] gleich mit? Woher weisst du dass du [foo] ändern darfst, und dass es nicht vielleicht doch was anderes bedeutet?
Dann das wichtigste überhaupt: Ein GPF bedeutet, dass das Programm etwas ganz böses gemacht hat, und jetzt sofort beendet werden muss. Das ist ein Befehl von der CPU.
Dieser Text wird unter jedem Beitrag angezeigt.

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 31. October 2005, 13:45 »
Naja, du kannst auch einen vom Programm definierten Exceptionhandler aufrufen, der dem Programm erlaubt, den Fehler zu verarbeiten. (z.B. bei Division durch 0 ist das sehr sinnvoll.)

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #7 am: 31. October 2005, 14:00 »
Der Kernel fängt die Exception ab. Was er dann macht bleibt ihm überlassen. Programm killen, was anderes ausführen, ...
*post*

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 31. October 2005, 16:22 »
Vielen Dank für die Antworten.

 

Einloggen