Nabend zusammen,
ich habe mir mal Gedanken über meinen Kernel gemacht.
Mein Kernel soll wirklich nur das Nötiggste machen.
- GDT/IDT/ISR/IRQ/PIC/PIT initialisieren
- den Scheduler bereitstellen
- Methoden für den Speicher (memset, etc)
Ich denke du brauchst Sachen wie malloc() (womit eine Menge anderer Sachen verbunden sind)
Der Rest soll über Treiber gemacht werden:
- Dateisystem , Paging und alles was sonst noch an Treibern fehlt
Diese Treiber sollen erst nachgeladen werden (sprich nicht mitkompilieren).
Wie kann ich die denn zur Laufzeit laden?
ELF in den Speicher laden (deswegen wäre es außerdem günstig Paging im Kernel zu haben) und Symbole auflösen.
Nun zu meinen Fragen:
Ist dieser Aufbau überhaupt sinnvoll?
Naja bis auf, dass ich Speicherverwaltung auch in den Kernel reinmachen würde, sieht das für mich zumindestens sinnvoll aus. Ist natürlich nicht besonders ausführlich, deswegen kann ich das nicht 100%ig beurteilen.
Bei dem Scheduler habe ich ein paar Verständnisfragen:
- Was brauch ich denn alles an Strukturen?
Du brauchst eine Struktur für einen Prozess. Diese Struktur muss sachen, wie Register und Speicherzuordnung (z.B Pagedir) enthalten. Aber auch Dinge wie Name, PID, Parent, Children, geöffnete Objekte (z.B Dateien) kann man reinmachen.
Ich habe mir gedacht, dass ich einerseits einen Prioritätsparameter habe, dann habe ich noch einen counter der die Rechenzeit mit zählt und dann die Strukturen für die Register und den Stack.
Jo, wie ich oben gesagt habe, aber Speicher wäre noch wichtig.
Wie rette ich den gesamten Prozessor in die Strukturen?
Mein Programm wird doch über einen Interrupt unterbrochen, wenn ich nun die Behandlungsroutine aufrufe steht in meinem PC doch schon eine andere Befehlsadresse. Wo bekomme ich die alte her, damit ich sie speichern kann?
Wenn der Interrupt aufgerufen wird, liegen einige Register (darunter auch EIP und ESP) auf dem Stack. Da kannst du die dann herholen und in die Struktur "retten".
Wenn mein Scheduler arbeitet muss ich doch ein paar Interrupts maskieren, oder?
Nicht dass ich wüsste.
Dachte jetzt mal an den PIT und Software-Interrupts.
Wie mache ich das?
Der PIT muss am Anfang ge-remappt werden. Bei mir ist er imho auf 0x20 bis 0x30 (0x00-0x1F sind Exceptions). Dann hast du da deine IRQs. Danach kommen bei mir ein paar andere Interrupts (APIC, unwichtig für dich). Und dann hab ich meinen Softwareinterrupt bei 0x37. Du kannst ihn natürlich auch woanders hinmachen (Linux hat ihn z.B bei 0x80). Du musst eigentlich nur den Interrupt in der IDT registrieren und den Handler zuweisen. Im Handler kannst du dann Daten (z.B welcher Syscall aufgerufen werden soll, usw.) aus dem Speicher des Prozesses oder aus den Registern holen.
Das war es erst einmal an Fragen.
Da kommen bestimmt noch mehr.
Fragen sind bei uns immer willkommen, solange der Gegenüber vorher selbst nachdenkt
(was, wie ich finde, du gut gemacht hast)