Speicherverwaltung

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Speicherverwaltung

Beitrag von cloidnerux » So Mär 15, 2009 4:21 pm

Achso, danke.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Speicherverwaltung

Beitrag von cloidnerux » Sa Jun 13, 2009 7:30 pm

Also, ich hab noch einmal einige grundlegende Fragen zum Paging:
Die pagedir besteht aus 1024 pointern die an sich ein Eintrag in der Pagedir sind und man deren Addresse, auf die sie verweisen, modifizieren muss oder?
Und jedes dieser Pagedir Elemente zeigt auf den ERSTEN pointer einer pagetable.
Das ersten Elmente einer Pagedir oder pagetable muss auf einer durch 4096(Dezimal) Zahl liegen, damit sie durch eine page geschützt wird.
Pages werden vom Computer Automatisch gesetzt und müssen nicht über eine Kenrelfunktion wieder gelöscht werden, oder irre ich mich da?
Und noch eine Frage:
Kann man ein Pagedir Element durch ein Struct darstellen, auf das das Element verweißt oder muss man die Addresse erst in des Struct konvertieren?
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Speicherverwaltung

Beitrag von Dirty Oerti » Sa Jun 13, 2009 11:03 pm

Tag :)

PageDir und PageTable müssen an 4 KB-Grenzen liegen, ja.

In der PageDir sind (es müssen nicht alle Einträge gesetzt sein) Einträge, die auf eine PageTable zeigen. Eintrag heißt dabei, dass die ersten 20 Bit die ersten 20 Bit eines 32 Bit Pointers auf eine PageTable liefern.( Deswegen liegen die auch an 4 KB Grenzen....) Die restlichen Bits sind Einstellungen.

Was meinst du mit pages werden automatisch gesetzt??
Natürlich nicht...?

Wenn ein Programm im virtuellen Bereich Speicher an der 1GB-Marke anfordert, dann wandelst du die Adresse in die entsprechende Eintragnummer der pageDir um, setzt die notfalls (auf eine neue PageTable) und in der PageTable nimmst du dann den richtigen Eintrag. Da rein schreibst du die Adresse (phys!!!!!) des Frames, wo der neu angeforderte Speicher liegen soll.

Die letzte Frage versteh ich nicht ganz??

Code: Alles auswählen

struct pagedir_entry {
   unsigned int add:20;
   unsigned int flags:12;
}
Das könnte funktionieren? Aber was spricht gegen ein bisschen Bitkombiniererei? Dafür braucht man doch kein Struct??
Eine PageTable/PageDir:

unsigned int tab[1024];
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Speicherverwaltung

Beitrag von cloidnerux » So Jun 14, 2009 5:56 pm

Die letzte Frage versteh ich nicht ganz??

Code: Alles auswählen
struct pagedir_entry {
unsigned int add:20;
unsigned int flags:12;
}



Das könnte funktionieren?
Ich habe mal etwas nach diesem Tutorial hier gemacht, aber es Funktionierte nicht:
http://www.jamesmolloy.co.uk/tutorial_h ... aging.html
Was meinst du mit pages werden automatisch gesetzt??
Also, nachdem der Computer sowas wie den TLB hat und es auch ein CPU Access Bit gibt, dachte ich mir das das so sein könnte.

Also fasse ich mal zusammen:
Paging besteht aus 2 Abstraktionschichten: Der PageDirectory und den PageTables.
Jede PageTable und PageDirectory sind 4KB groß und straten auf einer durch 0x1000 Teilbaren Addresse.
Jedes programm hat eine eigene pageDirectory.
Der erste Eintrag der ersten PageTable ist die virtuelle Speicheraddresse 0, kann baer im reelen Speicher sonstwo liegen, das geht halt so weiter und weiter.
Wenn ein Programm auf eine Stelle zugreift, auf die noch keine Page gemappt ist, dann wird ein Pagefault ausgelöst.
Oder stimmt da wieder etwas nicht?
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Speicherverwaltung

Beitrag von Dirty Oerti » So Jun 14, 2009 7:46 pm

Das Tutorial ist vom Prinzip her aber wirklich gut :)
Bei mir funktioniert es, mehr oder weniger, nachdem ich eine andere Art der Verwaltung anstrebe :)

Soweit ist das eigentlich alles richtig.
Und wenn der PageFault ausgelöst wird, dann musst du (als Betriebssystem) den abfangen und weiterverarbeiten:

1. Der virtuelle Speicher ist "freier" Speicher, also kein Code oder sowas. Du musst also einfach nur einen Frame (phys Speicher) anfordern und dann die entsprechende page auf diesen Frame mappen.
2. Der virt Speicher ist "Programmspeicher", also Speicher, der eigentlich schon gewisse Werte zu enthalten hat (Funktionen, Stack, etc). Das musst du (iwann mal) aus dem Programm selbst laden (je nach Strategie wird das aber schon beim Programmstart erledigt)
3. Der virtuelle Speicher liegt evtl schon im Cache, in der Auslagerungsdatei oder wie auch immer es genannt wird. Dann muss die entsprechende Page von dort in einen freien Frame geladen werden.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Speicherverwaltung

Beitrag von cloidnerux » Do Jul 09, 2009 6:31 pm

Ich habe mal eine Frage:
Also, ich ahbe die Speicherverwaltung soweit neu Implementiert, doch hängt sich das Init-Script auf, sozusagen.
Er Allokiert Frames und Pages für den kenrel und hört aber nicht wieder auf.
Die Addresse für das ende des Kernels liegt bei: 0x105130, was ca. einem Megabyte entspricht.
Ist diese zahl normal oder eine Anomalie?
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Speicherverwaltung

Beitrag von Dirty Oerti » Do Jul 09, 2009 11:06 pm

Äh, naja, das hängt natürlich davon ab, wie du deinen Speicher verwendest.
Ich nehme mal an du lädst den Kernel auf 1 MB (=0x100000).
Folglich hast du 0x5130 Bytes verwendet. Sprich etwas mehr als 20 KB.

Jetzt schau, wie groß dein Kernel ist und dann müsstest du wissen, ob das normal ist oder nicht.

( 0x100000 entspricht 1 MB ! )
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Speicherverwaltung

Beitrag von cloidnerux » Fr Jul 10, 2009 12:26 pm

Jetzt schau, wie groß dein Kernel ist und dann müsstest du wissen, ob das normal ist oder nicht.
Ok, das wäre dann natürlich normal, ihc dachte schon es wäre etwas falsch gelaufen.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten