Autor Thema: Memory Manager  (Gelesen 7769 mal)

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« am: 23. August 2005, 07:56 »
Nun ich hab mal in meinem C-Kernel die IDT, PIC und GDT implementiert. Ich denke nun ist der Memory Manager an der Reihe. Leider habe ich da so meine Probleme den Memory Manager zu verstehen, daher ein paar Fragen:

1.) Was genau ist/sollte der Funktionsumfang der Memory Manager sein?

2.) Wie baue ich den am besten ein bzw. was fuer Moeglichkeiten stehen mir offen?

3.) kennt jemand ein Tutorial zu Memory Manager?

4.) soweit ich dies abschaetzen kann dient der Memory Manager zum linken von Treiber und ausfuehren von Executeables, oder?

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #1 am: 23. August 2005, 10:16 »
Also, erstmal stehst du vor dem ganz grundsätzlichen Problem eine Funktion wie malloc zu implementieren.

Da du ja einen monolithischen Kernel machen willst so wie ich das verstanden habe, musst du im Kernel generell zwei Dinge machen: Den physikalischen Speicher verwalten und jeden Addressraum.

Wie das mit dem physikalischen Speicher ganz primitiv gehen könnte habe ich hier mal aufgeschrieben: http://legendos.codingworld.net/tutorials/phys_memory_tutorial.html
*post*

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #2 am: 23. August 2005, 15:39 »
hey cool - werd mir dann mal dein Tut reinziehen und gegebenenfalls nochmals posten.

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #3 am: 23. August 2005, 18:20 »
Der virtuelle Teil wird in dem halt nicht behandelt. Und es lohnt sich den Code nicht per Copy & Paste zu kopieren! ;)
Aber das ist bei jedem Tutorial ja so ...
*post*

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #4 am: 23. August 2005, 18:28 »
Zitat von: Legend
Der virtuelle Teil wird in dem halt nicht behandelt. Und es lohnt sich den Code nicht per Copy & Paste zu kopieren! ;)
Aber das ist bei jedem Tutorial ja so ...


Ja das ist klar - wer will einen Kernel schon mit COPY & PASTE schreiben  :lol:

Was meinst du mit virtuellen Teil? Virtual Memory?

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 23. August 2005, 19:41 »
In dem Tutorial wird nur erklärt, wie man den physikalischen Speicher verwalten kann, und nicht wie man das Paging verwaltet. Für die Verwaltung der Pages kannst du dir das PM Tutorial angucken, da wird aber nur die Theorie beschrieben, für den praktischen Teil gibts z.B. hier ein Tutorial http://www.osdever.net/tutorials/paging.php?the_id=43 , ein besseres hab ich leider bisher noch nicht gesehen. Dort werden die Flags auch nicht so gut beschrieben wie im PM Mode Tutorial.^^

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #6 am: 24. August 2005, 02:34 »
Man kann auch statt dem Malloc()-Prinzip es einfach so machen, wie ich, dass man die Anwendung in den Speicher schreiben lässt und ihr dann eine Page einklinkt, wenn sie auf einen noch nicht zugegriffenen und nicht gemappten Bereich zugreift. Ich verwende einen Pagestack. Das erspart das durchforsten des Bitmap und ist schneller, kostet dafür aber auch viel mehr Speicher. Mein Paging-Interrupt funktioniert also nach folgendem Prinzip: (Pseudocode)


>Zugriffspage ermitteln
>Nachsehen ob die Page ausgelagert (1) oder noch nicht benutzt (2) ist
>(1)
>>Nachsehen ob eine Page aufm Stack ist(1) oder nicht(2)
>>(1)
>>>Page vom Stack holen
>>>Page in die Neue einlagern
>>>Page einbinden
>>>FERTIG!!!
>>(2)
>>>beliebige Page auslagern
>>>Page in die Freigewordene einlagern
>>>Page einbinden
>>>FERTIG!
>(2)
>>Nachsehen ob Page aufm Stack ist(1) oder nicht(2)
>>(1)
>>>Page vom Stack holen
>>>Page einbinden
>>>FERTIG!
>>(2)
>>>beliebige Page auslagern
>>>Page einbinden
>>>FERTIG!


So ist es relativ leicht, unkompliziert und schnell zu lösen und lässt dabei der Anwendung sehr viel Freiraum. Eventuell kann man später auch malloc()-free()-Funktionen zur Verfügung stellen, die dann aber nur virtuell im Bereich der Anwendung arbeiten und nichtmehr mit dem Betriebssystem zusammen.
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #7 am: 24. August 2005, 07:43 »
Ja, schon klar... muss mir mal die ganzen Infos reinziehen - ist ja nicht gerade wenig  :x

ena

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 24. August 2005, 07:59 »
Moin

vielleicht hilft dir diese Seite in irgendeiner art und weise weiter

http://www.fh-zwickau.de/doc/prmo/pmtutor/text/p_spez1.htm

Mfg ena

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #9 am: 24. August 2005, 09:58 »
Nun ja, der interessantere Teil von malloc ist es, dafür zu sorgen das ich bei einem malloc (1) nicht ne 4kb seite bekomme! ;)
*post*

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #10 am: 24. August 2005, 16:51 »
Zitat von: Legend
Nun ja, der interessantere Teil von malloc ist es, dafür zu sorgen das ich bei einem malloc (1) nicht ne 4kb seite bekomme! ;)


hast du dazu einen Tip bzw. einen Anhaltspunkt?

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 24. August 2005, 17:06 »
Naja, man holt sich zuerst einen oder mehrere 4 KB Blöcke.
Dann schreibt man dort eine Struktur rein, in der steht, wie viel Speicher von den 4KB belegt ist. Wenn malloc() das nächste mal aufgerufen wird, geht man zum Ende des belegten Speichers und schreibt dort wieder eine Sturktur rein, in der steht, wie viel belegt ist usw. Das ist nur ein Beispiel, wie man malloc() aufbauen könnte, man kann das natürlich auch anders und effizienter machen.

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #12 am: 24. August 2005, 17:21 »
Zitat von: SSJ7Gohan
Naja, man holt sich zuerst einen oder mehrere 4 KB Blöcke.
Dann schreibt man dort eine Struktur rein, in der steht, wie viel Speicher von den 4KB belegt ist. Wenn malloc() das nächste mal aufgerufen wird, geht man zum Ende des belegten Speichers und schreibt dort wieder eine Sturktur rein, in der steht, wie viel belegt ist usw. Das ist nur ein Beispiel, wie man malloc() aufbauen könnte, man kann das natürlich auch anders und effizienter machen.


Tja wenn man es weis ist es ja so einfach :-)

Danke für den Tip - der ist Gold wert...

 

Einloggen