Autor Thema: Paging Error 14  (Gelesen 17516 mal)

mineorbit

  • Beiträge: 55
    • Profil anzeigen
Gespeichert
« am: 09. May 2013, 11:18 »
Hallo LowLevel Community,
Nachdem ich jeden Schritt eures Tutorials befolgt habe, hat alles geklappt.
Nur ab dem Paging tritt immer Exception 14 auf die ja mit dem Paging zusammenhängt.
Wie kann ich diesen Fehler verhindern. Über eine Antwort freue ich mich sehr.
(Entschuldigung falls ihr dieses Thema schon hattet!)
Mineorbit

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 09. May 2013, 14:20 »
Hallo,

Exception 14 ist #PF - Page Fault. Die hat verschiedenste Ursachen.

Um diesen "Fehler" zu verhindern, musst du erstmal rauskriegen, was diesen "Fehler" verursacht. (Page Faults sind übrigens nicht unbedingt Fehler, sondern können von Betriebssystemen gezielt eingesetzt werden.)

Gruß,
Svenska

mineorbit

  • Beiträge: 55
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 09. May 2013, 14:26 »
Aha schon mal vielen Dank!
Kann Es damit zusammen hängen, dass er das Testprogramm(also Test.bin) nicht laden kann?
Wo speziell muss ich die test.bin ablegen(wie muss das Verzeichnis aufbauen)?
Mineorbit 
EDIT:
Was meinst du genau mit Fehler in Zeile 42?
 
« Letzte Änderung: 10. May 2013, 12:17 von mineorbit »

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 10. May 2013, 10:42 »
Fehler in Zeile 42.

SHyx0rmZ

  • Beiträge: 67
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 10. May 2013, 12:50 »
Er meint damit, dass wir aus den kargen Informationen, die du uns gibst, nicht ableiten können, wo der Fehler liegen könnte. Für eine erste Idee, wo der Fehler liegen könnte, solltest du dir den Error Code anschauen, der beim Page Fault auf den Stack gelegt wird. (Siehe auch: http://www.lowlevel.eu/wiki/Exception#Page_Fault)
@X="krJhbuaesrytre c a cnR.ohut";while@X[/(..)(.)/];@X=@X[3..-1]+$1;print$2;end
"Scheiß auf Perl, wir haben Kekse" - Emperor Ruby

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 10. May 2013, 13:02 »
Und fast wichtiger noch eip und cr2 anschauen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

mineorbit

  • Beiträge: 55
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 10. May 2013, 14:23 »
Also ich habe nachgeschaut und denke der Fehler ist
"*auf eine Page zugreift, die nicht aktiv ist (Present-Bit gelöscht)."
Weil er ja auf die test.bin zugreifen muss die ich nicht in dem Image eingeordnet wurde.
Wo genau muss ich die Test.bin hinlegen,wenn überhaupt.
Mein Verzeichnis ist so aufgebaut
*boot/grub/stage1s,tage2,Menu.lst
*kernel.bin

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 10. May 2013, 16:10 »
Dein Betriebssystem unterstützt höchstwahrscheinlich kein Dateisystem. Das heißt, in deinem Betriebssystem gibt es kein "test.bin". Alles spielt sich im RAM ab, auch der Page Fault.

Magst du uns wirklich nicht verraten, was "kernel.bin" und "test.bin" sind und wie du die lädst?

Schaue dir an, wo der Inhalt deiner Dateien im RAM hingeladen wird.
Schaue dir an, wie dein Mapping aussieht. Mit "info mem" und "info tlb" kannst du in der Qemu-Console sehen, was Qemu denkt.
Überlege dir, was du wohin gemappt hast, wo dein Code ausgeführt wird und wo er sich im RAM befindet.

Deine Fehlerbeschreibung ist unvollständig (und deine Vermutung höchstwahrscheinlich falsch). Wenn du alle diese Fragen beantwortet hast, können wir nochmal drüber nachdenken. Vermutlich wirst du deinen Code posten müssen.

edit: Ich mag normalerweise keine Hervorhebungen in Fettschrift, aber hier ist das eher angebracht.

Gruß,
Svenska
« Letzte Änderung: 10. May 2013, 16:12 von Svenska »

mineorbit

  • Beiträge: 55
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 10. May 2013, 19:30 »
Also kernel.bin wird von grub geladen test.bin wird nicht aufgerufen.
kernel.bin und test.bin habe ich genau nach eurem tutorial gebaut.(So was sollte man eigentlich nicht machen aber ich hab mir das auch alles durch gelesen)
Qemu würde ich gerne nutzen, krieg ich aber nicht installiert(ubuntu12.10)
Ansonsten weiß ich nicht wie ich das geladene im Arbeitsspeicher finden kann.
Danke für eure hilfe mineorbit
 
« Letzte Änderung: 10. May 2013, 19:32 von mineorbit »

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 11. May 2013, 10:25 »
Du musst deine test.bin schon mit GRUB laden, wenn du keinen Dateisystemtreiber und Floppytreiber hast.
Dazu musst du in deiner menu.lst einfach eintragen:
module /test.binund natürlich dann auch die test.bin auf das Image kopieren.
Dann lädt dir GRUB die test.bin in den RAM.
Wo genau die dann liegt erfährst du mittels multiboot.
Mehr dazu steht hier: http://www.lowlevel.eu/wiki/Multiboot

mineorbit

  • Beiträge: 55
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 11. May 2013, 13:35 »
Danke, dass habe ich total vergessen  :grin:
Naja aber gibt nachwie vor Exception 14 aus.
Ich hab entdeckt das man im tutorial alles downloaden kann.
Hab die makefile gestartet und alles reingezogen und dort tritt auch Exception14 auf.
(Ich hoffe ich mache euch keine Umstände!)
Mineorbit

oern

  • Beiträge: 44
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 11. May 2013, 14:09 »
Mappst du das Prozessimage denn auch mit dem Userflag? Ansonsten löst die CPU die Exception aus, weil der Task im Usermode laufen soll und die Seiten so gemappt sind, dass nur Kernelmode-Code darauf zugreifen darf. Das Problem und eine sehr provisorische Lösung wird im Tutorial beschrieben (kurz vor "Aufteilung des Adressraums").

mineorbit

  • Beiträge: 55
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 11. May 2013, 15:52 »
vielen Dank, dass scheint tazächlich der fehler zu sein!
Nur wie Mappe ich die vier 4Mb um?
Danke für die vielen Antworten,
Mineorbit

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 12. May 2013, 15:08 »
Das entspricht aber nicht dem Fehlercode, den du oben genannt hast (page not present).
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

mineorbit

  • Beiträge: 55
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 12. May 2013, 15:14 »
Das entspricht aber nicht dem Fehlercode, den du oben genannt hast (page not present).
Naja jetzt habe ich die Page ja in den Ram geladen.Nur irgendwie findet er sie nicht.
Mineorbit

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 12. May 2013, 15:19 »
Wohin in den RAM lädst du denn die Page? An der Stelle ist sie dann auch.

Du brauchst die Page weder suchen noch finden, weil du vom GRUB gesagt bekommst, welches Modul er an welche Stelle geladen hat. Und diesen Bereich (von "Adresse" bis "Adresse + Größe", aufgerundet auf PAGESIZE) musst du passend mappen.

mineorbit

  • Beiträge: 55
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 12. May 2013, 15:26 »
Welchen genauen befehl muss ich eingeben, damit mir grub das sagt?
(Könnte man das Paging Problem nicht so lösen, dass ein Manager den Prozessen eine Zeit einteilt um auf die Resourcen zuzugreifen und die zeit von einer Pit abgezähltwird(Korigiert mich bitte wenn das vollkommener Schwachsinn ist :arrow: ))
 
Mineorbit

streetrunner

  • Beiträge: 67
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 12. May 2013, 17:39 »
Da brauchst du keinen Befehl, es reicht wenn du die multiboot_info_t Struktur ausliest. Wenn du deinen Kernel mit Grub bootest, findest du wenn Grub die Kontrolle an dich abgibt in eax eine Magic-Number (sollte 0x2BADB002 sein). Diese validiert den Zeiger auf die multiboot_info_t Struktur, zu finden in ebx.

Gruß,
Streetrunner

mineorbit

  • Beiträge: 55
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 12. May 2013, 18:08 »
Wie genau gibt man eax und ebx aus?Wenn müsste das dann doch in start.S?Langsam wird's echt schwierig!
(Gibt es eine Anleitung?)
mineorbit

streetrunner

  • Beiträge: 67
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 12. May 2013, 18:41 »
Zitat
(Gibt es eine Anleitung?)
Ja gíbt es, z.B. hier (zwar auf Englisch aber egal):
http://wiki.osdev.org/Bare_Bones
Da kannst du sehen das in der "loader"-Funktion die Register eax auf die globale Variable "Magic" und ebx auf die globale Variable "mbd" geschrieben werden.
In "kmain" werden diese Variablen dann einfach verwendet.

Du kannst aber auch direkt zu Beginn deiner start.S, also direkt nach dem Multiboot-Header, die beiden Register auf den Stack schieben. Das sähe dann ungefähr so aus:
.section multiboot

#define MB_MAGIC 0x1badb002
#define MB_FLAGS 0x0
#define MB_CHECKSUM -(MB_MAGIC + MB_FLAGS)

.align 4
.int MB_MAGIC
.int MB_FLAGS
.int MB_CHECKSUM

.section .text

.extern Main

.global _start
_start:
mov $kernel_stack, %esp

pushl %eax     ; eax auf den Stack schieben
pushl %ebx     ; und ebx auch

call Main

Die passende Funktion "Main" sieht dann etwa so aus:
void Main (void* mbt, uint32_t Magic)
{
...
}

Gruß,
Streetrunner

 

Einloggen