Lowlevel
Lowlevel => OS-Design => Thema gestartet von: gcalctool am 11. January 2010, 16:17
-
Hi Lowlevel Team!
Erstmal ein großes Lob an die Community und and das Forum! Es hat mir schon des Öfteren geholfen. Nun habe ich aber eine Frage die ich leider nicht durch suchen richtig erroieren konnte. Ich programmiere gerade ein kleines eigenes Betriebssystem um den PC besser zu verstehen. Bis jetzt hab ich alles was mit dem Speicher zu tun hat den Compiler erledigen lassen. Alles durch Strukturen etc. abgewickelt, um ja nicht mit dem Speicher direkt zu arbeiten. Ich habe quasi das Problem nur rausgeschoben. Nun bin ich beim Memory Management angelangt und das ist mein großes Problem:
Folgendes ist mein Status Quo(was den Speicher betrifft):
- Mein Kernel wird von GRUB an die Adresse 0x100000 geladen.
- Ich habe eine GDT initialisiert mit einem Code und Datensegment für den Kernel (Ring0) und für Programme(Ring 3) (Baseaddress:0 Grösse:0xfffff)
- Die GDT ist geladen und auch der Kernel liegt in Ring0. Das funktioniert alles tadellos.
Nun will ich Paging verwenden (Ring 3) ich weiß auch wie ich Paging initialisiere. Folgendes weiß ich:
- Mein Kernel an der Adresse 0x100000 startet.
- Mein Kernel 58498 Bytes groß ist
So. Wie finde ich nun raus, welcher Speicher frei ist, und wohin ich meine Pages mappen kann?
Wäre echt Super von euch, wenn einer sich die Zeit nehemen würde und mir das kurz erklären könnte!
Danke!
-
Hallo,
GRUB sagt Dir genau wo welcher physischer Speicher ist. Ein Teil davon ist bereits durch Deinen Kernel belegt, das ist Dir ja exakt bekannt, und der Rest ist eben frei. Du musst nur beachten dass das alles physische und keine virtuellen Adressen sind. Diese Infos muss der Kernel-StartUp-Code in die Speicherverwaltung des Kernel injizieren und dann kanns losgehen.
Grüße
Erik
-
Wie gesagt, informiert dich Grub über die Speichersituation.
Das einzige, das in den GRUB-Infos fehlt ist dein Kernel und deine physikalische Speicherverwaltung, falls die extern liegt.
Wenn du nun deinen Speicher verwaltest, gibt dir GRUB an wo bestimmte Module liegen, oder wo freie Blöcke liegen.
Wenn du das alles kennst, kannst du leicht deine Speicherverwaltung aufbauen.
Hoffe, dass das geholfen hat ;)
Gruß
rizor
-
Hi!
Danke für eure schnellen Antworten jetzt stellt sich für mich nur noch eine Frage WIE sagt mir GRUB welche freien Plätze im Speicher vorhanden sind? Ich schätze mal er teilt mir das über den Multiboot-Header mit.
Ich glaube folgende Attribute des Headers haben etwas damit zu tun:
- mbs_mem_lower
- mbs_mem_upper
- mbs_mmap_length
- mbs_mmap_addr
Gibt die MemoryMap die freien Speichernereiche an? (Bitte sagt ja :-))
Danke Lg
-
Nun will ich Paging verwenden (Ring 3) ich weiß auch wie ich Paging initialisiere. Folgendes weiß ich:
- Mein Kernel an der Adresse 0x100000 startet.
- Mein Kernel 58498 Bytes groß ist
So. Wie finde ich nun raus, welcher Speicher frei ist, und wohin ich meine Pages mappen kann?
Vor allem solltest du einen Schritt nach dem anderen machen. Das heißt hier konkret, erstmal eine physische Speicherverwaltung aufsetzen und sich erst anschließend um die virtuelle (also Paging) zu kümmern. Für das physische MM gibt es im Wiki auch ein Tutorial, der anschließende Teil zu Paging fehlt leider noch.
Wie die Vorposter gesagt haben, kriegst du über Multiboot raus, was physisch belegt ist. Virtuell hast du keine Vorgaben, sondern kannst dir deine 4 GB belegen, wie du gerade Lust hast.
-
Gibt die MemoryMap die freien Speichernereiche an? (Bitte sagt ja :-))
Ja. Schau dir mal das an: http://lowlevel.brainsware.org/wiki/index.php/Teil_7_-_Physische_Speicherverwaltung
-
Also die Memmap gibt dir auch dir reservierten Blöcke an.
Liegt dann halt an dir, wie du mit der mb_info umgehst ;)
-
Danke eure Antworten haben mir sehr geholfen!
Lg
-
Habe da auch mal eine Frage zu der memmap.
Ist ein Speicherblock immer 4k-aligned?
Habe bisher immer vorher untersucht, ob das der Fall ist.
Bisher war es immer so.