Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Themen - Savatage

Seiten: [1]
1
Lowlevel-Coding / Ablauf Paging
« am: 24. October 2016, 08:55 »
Wie auch so viele andere im Forum macht mich das Paging ganz schön fertig. Bevor ich nun anfangen kann mein Paging umzusetzen, versuche ich mir eine Art Programmablaufplan zu erstellen, damit ich weiß ob ich alles bedacht habe. Ich würde hier gern darstellen wie ich mir das ganze vorgestellt habe um dann zu erfahren ob das grundsätzlich richtig ist oder ob doch noch irgendwo Verständnisprobleme sitzen.

Allgemein:
- Ausgangssituation: Adressraum ist in 4kB Speicherblöcke als physische Speicher eingeteilt, verwaltet durch eine Bitmap (halt wie im Tutorial)
- Paging soll wie im Tutorial unterteilt sein in PD und PT
- Jeder Prozess mit eignem PD, Kernel wird immer rein gemappt
- Adressraumaufteilung 0-1 GB für den Kernel, 1-4 GB für den Userspace

So, zur Adressraumaufteilung gleich meine erste Frage: Das wird nur realisiert durch entsprechend gesetzte Flags in den PTE's?

Ablauf:
1. Initialisierung des Paging (läuft einmalig bei Kernelstart):
- Speicherkontext anlegen
- Danach werden im Tutorial die ersten 4 MB an dieselbe physische wie virtuelle Adresse gemappen. Das widerspricht der Adressaufteilung von 0-1 Kernel und 1-4 Userspace. Also kommt an diese Stelle das Mapping des Kernels (+ Videospeicher, + Bitmap)
- Speicherkontext aktivieren
- Paging aktivieren

2. Speicherverwaltung (läuft immer wenn ein neuer Task startet):
- Neues PD anlegen und dem Task mitgeben
- Kernel in das PD mappen
- Kontextwechsel beim Start des neuen Task im Interrupthandler

Sozusagen habe ich nur die 2 Funktion + etliche Hilfsfunktionen.

So weit, so kompliziert. Sobald mein Paging aktiviert ist, habe ich nur noch virtuelle Adressen. Um dennoch an die PD ranzukommen habe ich schon mehrfach gelesen dass das PD einen Eintrag auf dich selbst bekommt und ich es sozusagen als zusätzliches PT verwalten kann. Damit komme ich an die phys. Adresse, die ich ja zum aktivieren des PD brauche.

Jetzt noch eine offene Frage:
Wenn mein Task beendet ist wird ja der Speicherkontext gewechselt. Was passiert mit dem alten Kontext? Gilt der als unbenutzt und kann einfach wieder neu belegt werden?

Ich bin unsicher ob noch ein Thread zum Thema Paging wirklich was hilft, aber ich bin doch etwas ratlos und freue mich über alle Kommentare, Anregungen und Einschätzungen

Eure Sava


 

2
Lowlevel-Coding / Syscall wird nicht aufgerufen
« am: 12. September 2016, 10:03 »
Hallo Team,

ich schaffe es einfach nicht einen Syscall von einem externen Programm auszulösen.
Die Initialisierung über Interrupt 48 sollte vollständig sein. In meinem Interrupt Handler fange ich den Syscall ab und leite ihn an die eigentliche Syscall Funktion weiter. Ich habe zunächst einen Syscall von einem externen Programm ausgelöst, und weil das nicht geklappt hat versuche ich nun von meiner init-Funktion des Kernels, nach der Initialisierung einen Syscall auszulösen:

asm("int $0x30" : : "a" (0), "b" ('0' + 1));
Das sollte ja einfach nur eine 1 ausgeben.
Zum Test habe ich mir im Interrupt-Handler mal ausgegeben welche Interrupts ausgelöst werden. Interrupt 0x30 ist jedoch nicht dabei. Es wird nur ständig der PIT (0x20) ausgelöst.

Kann es sein, dass der PIT sooft ausgelöst wird, das mein Syscall gar keine Chance hat an die Reihe zukommen? Ich habe dafür testweise den Syscall-Aufruf in der init-Funktion in eine Whileschleife gepackt um ihn immer wieder auszulösen. Allerdings wird der Syscall immer noch nicht ausgeführt.
Ich schaue jetzt noch mal die ganze Interrupt Initialisierung durch, weil doch eigentlich nur dort der Fehler sein kann, oder?

Gruß
Sava
3
Lowlevel-Coding / physische Speicherverwaltung - Excpetion 5
« am: 16. August 2016, 10:19 »
Hallo OS-Dev Team :)

Ich kämpfe im Moment mit dem Tutorial Teil 7.  Dabei habe ich mich weitestgehend an Tyndur orientiert. Ich habe die physische Speicherverwaltung umgesetzt, aber noch 2 statische Tasks (im Usermode) in ein Array geschrieben (noch keine Liste). Die Task wechseln sich ganz klassisch über den Interrupt ab.

Ohne Speicherverwaltung klappt alles prima. Mit Speicherverwaltung wird nur noch ein Task ausgeführt und irgendwann tritt eine Exception 5 auf. Das sieht für mich erstmal nach einem Problem mit den Interrupts aus, an denen ich für die Speicherverwaltung ja aber nichts geändert habe. Von dem her bin ich sehr unsicher wo ich überhaupt anfangen muss mit der Fehlersuche, bzw. wo das Problem liegen könnte.
Wenn einer eine Idee hat wo der Fehler sein kann, poste ich auch gern etwas Code. So macht das aber noch nicht viel Sinn.   

Was ist eigentlich die Exception 5? Und tritt das Problem bei anderen auch auf?
Ich muss auch zugeben, dass ich mit dem Debuggen etwas überfordert bin und nicht so richtig weiß wo ich ansetzten sollte.

Ich freue mich auf eure Antworten
Sava
4
Lowlevel-Coding / kprintf char ausgeben
« am: 28. April 2016, 10:04 »
Hallo Team,

dank des tollen Forums, des Wikis und des Tutorials habe ich es nun fast geschafft einen Tastaturtreiber zu schreiben. D.h:
- kprintf zum Zeichen ausgeben
- Interrupts funktionieren wie sie sollen
- Meine Tastatur ist initialisiert
- die Keycodes kann ich auf dem Bildschirm ausgeben

Natürlich möchte ich jetzt nicht die Keycodes ausgeben sondern die tatsächlichen Zeichen. Dafür muss meine kprintf-Funktion %c unterstützen. An der Stelle scheitere ich nun und hoffe auf die Community =)
Meine aktuelle kprintf entspricht dem Tutorium. Ich habe auch schon im Code von týndur gespickt und bin da doch etwas überfordert.

Gruß
Sava
5
Lowlevel-Coding / qemu Kommando nicht gefunden
« am: 09. April 2016, 21:21 »
Hallo ihr alten Hasen,

hier ist ein unwissender Neueinsteiger in die Thematik, der zwar voller Elan ist, sich aber noch ein wenig schwer tut und hier auf Unterstützung hofft.

Zu meinem Problem:
Ich möchte mir gern meinen eigenen Kernel schreiben. Dazu halte ich mich an das Tutorial und bin jetzt bei Teil 4 - Hello World angekommen (https://www.lowlevel.eu/wiki/Teil_4_-_Hello_World). Probleme habe ich jetzt mit dem Testen meines "Kernels". Dazu steht im Tutorial:

"qemu kann ab Version 0.11 Multiboot-Kernel direkt laden. qemu -kernel kernel bringt unseren Kernel zur Ausführung und schreibt ein wunderschönes Hello World in die linke obere Ecke. "

Ich habe qemu 2.6 von http://wiki.qemu.org/Download heruntergeladen und mit

./configure --target-list=x86_64-softmmu
make
make install

installiert. Möchte ich jetzt den Befehl "qemu -kernel kernel" ausführen, heißt es das Kommando wird nicht gefunden.
Nach etwas rumgooglen habe ich raus gefunden dass der Befehl in den neueren Versionen irgendwie anders heißt. (https://wiki.ubuntuusers.de/QEMU/)  Ich bin mir allerdings sehr unsicher und bitte deswegen hier um eine kleine Hilfestellung und Erklärung bzgl. Qemu.

Vielleicht noch als Hinweis:
Ich spiele das ganze in einer Virtual Box auf Debian durch.

Gruß
Sava
Seiten: [1]

Einloggen