Brans Kernel Tutorial



  • Hey Leute,
    ich habe noch ein paar Fragen zu dem Tutorial und weiterhgehende.
    1. Warum legt er in der GDT sowohl Codesegment wie auch Datensegment auf die Adresse 0. Für mich wäre es logischer wenn die Segmente nacheinander kommen würden und nicht aufeinander liegen würden.

    2. Ich würde mich jetzt als nächstes an eine Speicherverwaltung wagen wollen, aber wo soll der Heap liegen???
    Ich habe mir dazu überlegt einfach(haha) einen Block im Speicher rauszusuchen und ihn in die GDT eintragen und dann darüber Buch führen was belegt ist und was nicht. Hab auch schon gelesen das es da verschiedene Methoden gibt. manche Allokieren "bloß" ganze Blöcke, was die Buchführung erheblich vereinfacht. Aber das ist ja vom Speicherort unabhängig, oder?

    Vielen Dank für eure Antworten

    mfg



  • hotblack schrieb:

    1. Warum legt er in der GDT sowohl Codesegment wie auch Datensegment auf die Adresse 0. Für mich wäre es logischer wenn die Segmente nacheinander kommen würden und nicht aufeinander liegen würden.

    In den meisten (wenn nicht allen) modernen Betriebssystemen wird die Segmentierung nicht mehr benutzt, da sie bescheiden zu handhaben ist und sehr unflexibel ist (gegenüber Paging).
    Deswegen geb ich dir den Tipp dich nicht weiter mit segmentierung zu beschäftigen, sondern alle Segmente auf Basis 0 und Limit 4Gb zu setzen und gleich in Paging einsteigen. Erst wenn du Paging (und dessen Verwendung in einem OS) verstanden hast würde ich eine Speicherverwaltung beginnen.

    2. Ich würde mich jetzt als nächstes an eine Speicherverwaltung wagen wollen, aber wo soll der Heap liegen???
    Ich habe mir dazu überlegt einfach(haha) einen Block im Speicher rauszusuchen und ihn in die GDT eintragen und dann darüber Buch führen was belegt ist und was nicht. Hab auch schon gelesen das es da verschiedene Methoden gibt. manche Allokieren "bloß" ganze Blöcke, was die Buchführung erheblich vereinfacht. Aber das ist ja vom Speicherort unabhängig, oder?

    Der Heap beginnt normalerweise direkt nach dem Datensegment und wächst zur höheren Adresse hin. Normalerweise unterscheidet man zwischen zwei verschiedenen Stufen beim der Speicherverwaltung:
    * physikalisch: Dabei werden nur Speicherblöcke von der Größe einer Page (-> siehe Paging) behandelt (das ist typischerweise bei x86 4kb groß). Die Adressen der Pages kann man ganz gut als Bitmap oder als Stack speichern.
    * virtuell: Es werden Blöcke bis zu zB 4 oder 8 byte unterstützt. Da bedient man sich eines kleinen Tricks: Wenn man zB 4byte allozieren will, dann alloziert malloc intern 8byte und speichert in den ersten 4byte die größe des speicherbereichs und gibt dann einen Zeiger auf die letzten 4byte zurück. Erst bei free trägt man den Speicherblock in eine Liste ein, wobei hier die ersten 4yte als größe dienen und die zweiten 4byte als zeiger auf das nächste element in der Liste.



  • Ahh, okay.
    das hat ein wenig Licht ins dunkle gebracht, danke dir. das ich mich mit Paging auseinandersetzen muss war mir schon klar, hab es bloß noch etwas herauszögern wollen 😃 .

    Danke dir.


Log in to reply