Autor Thema: OS-Dev für Einsteiger  (Gelesen 6207 mal)

d4rken

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« am: 24. April 2011, 11:38 »
Hi,

ich bin noch recht neu auf dem Gebiet der OS Programmierung. Deshalb, habe ich mich übder das "OS-Dev für Einsteiger" Tutorial gefreut. Es ist gut erklärt und verständlich (lob an den autor), allerdings dachte ich mir, zum besseren Verständnis hole ich mir den Code des TuTs (http://git.tyndur.org/?p=tutorial.git;a=summary). Ich wollte diesen Code testweiße kompilieren (was auch wunderbar geklapt hat), allerdings bekomme ich sofort nach dem Start (und der Ausgabe "Hello World!") eine Exception (14 - Page fault). Nach ein paar nachforschungen stellte es sich heraus, dass der Fehler auftritt wenn man einen neuen Task erstellt (init_task).

Leider komme ich nicht zu einer Lösung des Problems. Vielleicht weiß jemand geneueres darüber.

Mit freundlichen Grüßen,
d4rken

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 24. April 2011, 12:19 »
Das liegt daran, dass der Beispielkernel noch nicht so weit ist wie das Tutorial. Der Code hört irgendwo in der Mitte von Teil 9 (also Paging) auf, deswegen tut das nicht richtig. Das heißt, den Code für die zweite Hälfte von Teil 9 musst du dir selber aus dem Text herleiten, aber für alles davor kannst du den Code hernehmen. Für jeden Teil der Tutorialreihe gibt es ein bis zwei Commits, so dass du an jeden Punkt des Tutorials zurückgehen und dir anschauen kannst, wie der Kernel zu diesem Zeitpunkt aussieht.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

d4rken

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 24. April 2011, 13:12 »
danke für die schnelle hilfe =)

Nebenfrage: is es möglich in assembla eine c methode aufzurufen und dieser auch parameter zu übergeben (und umgekehrt) ?

DerHartmut

  • Beiträge: 236
    • Profil anzeigen
    • Mein Blog
Gespeichert
« Antwort #3 am: 24. April 2011, 13:33 »
Ja, ist es. Schau' dir den Tutorialkernel an, Datei start.S:

Dort wird via ".extern init" dem Code bekannt gemacht, dass dort eine Funktion existiert die "init" heißt (definiert in init.c), die Parameter (in diesem Falle die Multiboot-Struktur) auf den Stack gelegt und dann die Funktion via "call init" aufgerufen.

$_="krJhruaesrltre c a cnp,ohet";$_.=$1,print$2while s/(..)(.)//;
Nutze die Macht, nutze Perl ;-)

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 24. April 2011, 14:32 »
Du musst einfach in deinem Assemblercode dasselbe machen, was ein C-Compiler auch tun würde, um die Funktion aufzurufen.

http://www.lowlevel.eu/wiki/Aufrufkonventionen#cdecl
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

d4rken

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 24. April 2011, 15:05 »
ok, dank eurer hilfe binc ich schon ein bisschen weiter gekommen (großese dankeschön)

ich hab mich bisschen gespielt:

also ich hab mithilfe von:
push 5

die zahl 5 auf den stack gepackt und dann die c funktion print_nr(int nr) aufgerufen. dies hat super geklappt. Allerdings nachdem ich das in dem beispielkernel gemacht habe, hat dieser eine "General Protection Fault" Exception geworfen.

Ich denke, das da schon einiges am stack war und ich ihn mit meinen 5 durcheinander gebracht habe.
Jetzt stellt sich für mich die frage, wie ich den ursprünglichen stack wiederherstellen kann (also den stack ohne die 12).
Aus dem Beispiel in dem oben gennanten Link hab ich herausgelesen, das ich das esp register (den stack pointer?) zurücksetzten muss. im beispiel wird das mit add esp, 3*4 gemacht.

Soweit ich weiß addiert man zum esp 3*4 also 12 hinzu, mir ist allerdings unklar wie das den Stackpointer zurücksetzt.

(Es kann natürlich auch sein das ich hier gerade kompletten blödsinn rede, entschuldige)
Ich danke für jede antwort =)

EDIT: offensichtlich bekomme ich die 5 mit add esp, 4 aus dem stack wieder "hinaus", es geht, aber mir ist leider noch nicht klar warum :/ (ich denke es wäre gut für mich sowas auch zu verstehen)
« Letzte Änderung: 24. April 2011, 15:25 von d4rken »

DerHartmut

  • Beiträge: 236
    • Profil anzeigen
    • Mein Blog
Gespeichert
« Antwort #6 am: 24. April 2011, 21:06 »
Öhhm...du packst mit push 5 alles, aber keine 5 auf den Stack...du zerschießt in dir höchstens ^^

mox eax, 5d
push eax

Würde ich machen...aber ich bin kein Assembler-Crack.
$_="krJhruaesrltre c a cnp,ohet";$_.=$1,print$2while s/(..)(.)//;
Nutze die Macht, nutze Perl ;-)

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 24. April 2011, 21:29 »
Öhhm...du packst mit push 5 alles, aber keine 5 auf den Stack...du zerschießt in dir höchstens ^^
Si tacuisses, philosophus mansisses. ;)

push 5 (in Intel-Syntax) packt den Immediate-Wert 5 auf den Stack, ist also genau das, was d4rken vorhat. Auf dem Stack landen im Protected Mode immer ganze dwords, das heißt diese 5 nimmt vier Bytes weg. Das push ist also eine Abkürzung für:
sub esp, 4
mov [esp], 5

Ich nehme an, das macht auch klar, warum ein add esp, 4 den Wert wieder vom Stack runternimmt.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

d4rken

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 25. April 2011, 14:52 »
ok, danke an die freundliche hilfe von allen =D

muss ich mir merken das ein dword 4 byte groß ist =)

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 26. April 2011, 08:59 »
Hallo,


@d4rken:
ich würde Dir die Intel-Manuals empfehlen, natürlich nicht alle über 500 Befehle (oder wie viele das aktuell wohl sind) sondern nur die etwa 200 wichtigen (sind die die schon beim 586 mit dabei waren, FPU kannst Du fürs erste auch ignorieren). Man wird zwar von der riesigen Informationsmenge teilweise erschlagen aber es lohnt sich sich da durch zu kämpfen. Vor allem ist die exakte Funktionsweise aller Befehle in einigermaßen verständlichen Pseudo-Code erklärt, das hilft oft beim Verständnis. Auch die anderen Kapitel erklären alle wesentlichen Zusammenhänge recht präzise, auch den Stack und alle anderen Basics.
Einfach mal für die nächsten Abende als leichte Gute-Nacht-Lektüre einplanen. ;)


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 26. April 2011, 09:20 »
Hm, das stelle ich mir als ganz schön trockene Lektüre vor... Ich benutze es eher als Nachschlagewerk - also, wenn mir nicht ganz klar ist, was push im Detail macht, dann steht es dort eben.

Für einmal komplette Grundlagen durcharbeiten würde ich vielleicht eher die AMD-Doku empfehlen, die ist thematisch gegliedert statt alle Befehle alphabetisch in einer großen Liste.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 26. April 2011, 09:44 »
Hallo,


ich selber habe schon seit ziemlich vielen Jahren nicht mehr in die Intel-Doku rein gesehen aber früher waren da noch andere Kapitel als nur die ewig langen Befehlslisten. Da wurde wimre die Funktionsweise der x86-CPU wirklich vom Anfang an erklärt.

Aber trocken habe ich das auch in Erinnerung. ;)
So sind solche Dinge eben.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 26. April 2011, 09:57 »
Weil du von den Befehlen geredet hast, die er anschauen soll, dachte ich, du meinst nur Teil 2. Wenn man sich die komplette Trilogie (mittlerweile sogar in fünf Bänden!) durchliest, dann hat man wirklich so ziemlich alles abgedeckt. Und wahrscheinlich ist es nicht ganz so trocken wie nur die Befehlsliste. ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen