Autor Thema: C-Programm laden  (Gelesen 2708 mal)

gcalctool

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« am: 21. January 2010, 16:44 »
Hallo Community!
Da ihr mir bis jetzt immer so super helfen konntet, habe ich jetzt noch eine Frage an euch:
Ich will mit meinem Kernel jetzt C Programme laden wie stelle ich das am Besten an?

Status Quo:
  • Ich kann von einer Diskette lesen und diese Daten in meinen Kernel Heap speichern.
  • Paging funktioniert
  • Softwaremultitasking funktioniert ebenfalls. Ich kann die A und B Tasks ausführen(sind zz. nur Funktionen)

Mein Multitasking arbeitet zz einfach so wie es in diesem Tutorial beschrieben ist: http://lowlevel.brainsware.org/wiki/index.php/Teil_6_-_Multitasking.

Jetzt möchte ich C Programme von der Diskette laden und dann ausführen wie stelle ich das am besten an? Wie kompiliere ich die Programme am besten? Wie erstelle ich einen Task aus dem C Programm und wie springe ich dann in dieses Programm? Ach Ja! Ich will die Programme derzeit nur in RING0 ausführen! Um einmal zu sehen wie das ganze funktioniert!

Wär super wenn ihr mir vielleicht ein paar Anregungen bzw. Beispiele geben könntet!

Danke!

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 21. January 2010, 17:20 »
Hallo,


Ich will mit meinem Kernel jetzt C Programme laden wie stelle ich das am Besten an?

Wenn Du die Programme als eigenen Prozess starten möchtest, dann sollte als erstes das Multitasking funktionieren, damit meine ich nicht nur den Kontextwechsel sondern auch das erstellen (und später natürlich auch löschen) eines neuen Prozesses mit eigenem Adressraum und allem was in Deinem OS dazugehört. Zum erstellen eines neuen Adressraum gehört auch diesen vom Kernel (oder bei Micro-Kernel eventuell von nem extra User-Mode-Service) aus mit Code und Daten befüllen zu können.
Einen passenden Executable-Loader (der im wesentlich die oben genannten Dinge benötigt und Dateien laden kann) brauchst Du natürlich auch noch.
Eine weitere sehr wichtige Design-Entscheidung muss dann getroffen werden: Welches Executable-Format möchtest Du benutzen? Viele tendieren hier zu ELF weil es gut Dokumentiert ist und ne Menge Beispielcode dafür gibt. Nachdem Du diese Entscheidung getroffen hast steht auch fest wie Du Deine Programme compilieren musst. Wahrscheinlich musst Du dann für GCC und binutils ein neues Target integrieren, nämlich Dein OS. Das sollte aber nicht allzu kompliziert sein, schau Dir mal die Patches an mit dehnen andere das machen.
Als kleinen Extraaufwand benötigst Du dann noch ne crt0.S also ein Stück Assembler-Code das den tatsächlichen Einsprungspunkt ins Programm enthält und dann den Stack u.ä. Basics initialisiert um anschließend main() aufzurufen. Dafür findest Du bestimmt auch ne Reihe Beispiele.


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

gcalctool

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 21. January 2010, 18:12 »
Hi danke für deine schnelle Antwort!
Ja ich habe mich schon entschieden ich will elf verwenden denn somit kann ich den gcc und ld als linker verwenden. Was ich nun wissen will ist wie ich das programm am besten laden? Was mich vor allem interressiert ist das mit dem virtuellen Adressraum! Wie stelle ich das am besten an?

Danke!!

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 21. January 2010, 18:31 »
Hallo,


Was ich nun wissen will ist wie ich das programm am besten laden?
Ich würde vorschlagen Du lädst die ELF-Datei direkt in den Speicher und lässt dann den ELF-Loader drüber laufen der dann alles interessante (also Code und Daten) raus holt und das dann in den neuen Adressraum packt (relozieren und so Sachen sollten dabei passieren), etwas toller wirds wenn der ELF-Loader das beim laden der Datei on-the-fly kann (also ohne zwischenspeichern).

Was mich vor allem interressiert ist das mit dem virtuellen Adressraum!
Was soll ich jetzt auf diese Frage (ist das überhaupt eine) antworten? Was mich vor allem interessiert ist das mit dem korrektem stellen von Fragen in einem Forum.

Wie stelle ich das am besten an?
Ich würde vorschlagen Du ließt so viel wie möglich darüber (die Suchwerkzeuge im Internet können bestimmt behilflich sein) und denkst Dir dann ein eigenes Konzept (kopieren währe ja langweilig) aus.


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

gcalctool

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 21. January 2010, 18:56 »
Ok danke!
Dann etwas konkreter :)
Wie erstelle ich einen virtuellen adressraum?

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 21. January 2010, 19:16 »
Wenn du das noch nicht heraus hast, dann mag das, was du an Paging schon hast, zwar funktionieren, aber vollständig ist es nicht. ;)

Ein Adressraum wird beim i386 durch sein Page Directory repräsentiert, du musst also ein neues PD anlegen. Beim Taskwechsel muss dann entsprechend cr3 mit dem PD des neuen aktiven Tasks neu geladen werden.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen