Speicherverwaltung

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
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 Dez 28, 2008 1:59 pm

unsigned long page_table[1024] [1024];
memset(page_table, 0, 1024*1024*sizeof(unsigned long));//(eigntl. ohne &)
cloidnerux hat geschrieben:Kann es sein, das es bei zu wenig Speicher probleme gibt?
Natürlich...aber bei mir kam dann immer ein Triple Fault...
Und du hast doch sicher eine Möglichkeit um festzustellen, wie viel Speicher du verbrauchst?

Wie man das bei Qemu einstellt?
Puh...weiß ich im Moment nicht.
Ich würde dir auf lang eh dazu raten, bochs zusätzlich zu verwenden. Da hast du doch ein paar mehr Debugausgaben...
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 Dez 28, 2008 2:24 pm

aha, danke.
Ich bekomme entweder ein Doublefault oder ein Triple Fault.
Der triple Fault nur, wenn ich in cr0 schreiben will?
Warum weiß ich net.
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 Dez 28, 2008 2:48 pm

Du bekommst den Fault nicht, weil du in cr0 schreiben willst...
Du bekommst den Fault, weil du in cr0 schreibst und keine gültige PageDir in cr3 geladen hast.
Das resultiert in einem PageFault.
Da der Code für den PageFault Handler aber auch nicht gefunden werden kann (immernoch ungültiges PageDir..) resultiert das in einen DoubleFault. Der Handler dazu wird auch wieder nicht gefunden, worauf hin die CPU einen Triple Fault wirft und sich verabschiedet.

Wie schon gesagt:
Du hast eine ungültige PageDir.
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 Dez 28, 2008 3:15 pm

OK, Danke.
Aber wie muss eine Gülzige PageDir aussehen?
Egt. ist die PageDir nur eine 1024 Einheiten langer Intarray, der mit jedem eintrag auf eine PageTable mit wieder 1024 einträgen verweist.
Also nochmal mein Wissen über Paging:
Man braucht 1 PageDir, ein Array von 1024 32-Bit(int) Einträgen.
Jeder Eintrag verweist auf eine PageTable, eine Array mit 1024 einträgen à 32-Bit.
Ein Pagedireintrag hat in den oberen 20 Bit die Addresse der Page Table, der Rest sind einstellungen.
Ein PageTable eintrag hat in den Oberen 20 Bit die Adreesse des Physikalischen Speichers, der Rest sind Einstellungen.
Die Startaddresse der PageDir muss im cr3 register gespeichert werden und im cr0 register muss Bit 31(0..31) gesetzt werden.

Momentan sieht das bei mir so aus:

Code: Alles auswählen

unsigned int pagedir[1024];
unsigned int page_table[1024][1024]

pagdir[0]=(((unsigned int)&page_table[1][0])<<12) | settings);
...
Aber wie ist das mit dem PageFault Handler?
Ist ja einer von ISRs.
Und für die hab ich ja nen Standart Handler, egtl.
Gibt es da nohc einen Speziellen Interrupt oder was?
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 » Di Dez 30, 2008 4:39 pm

Wär ja mal was für die WIKI...
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 » Mi Jan 07, 2009 12:33 pm

Super, paging läuft, alloc_page und free_page sind vorhanden, was jezt?
Soll ich jezt den Speicher für meinen Kernel allocieren?,
oder mit dem Heap anfangen oder über TSS gehen und externe Programme zum laufen bringen?
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 Jan 08, 2009 6:12 pm

paging läuft
Von dem her was du schreibst bezweifle ich das. Damit "Paging läuft" musst du in der Lage sein, neue PageDirectories dynamisch zu erzeugen und dynamisch den verwendeten Speicher zu allokieren. Dann kannst du mit Multitasking anfangen. (Du kannst auch vorher mit Multitasking anfangen, dann musst du aber auf Adressschutz verzichten)
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 Jan 08, 2009 7:06 pm

aha, 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 » So Mär 15, 2009 3:53 pm

Ich musste auf grunf von Problemem meine komplette Speicherverwaltung neu Auflegen.
Jezt hänge ich aber an dem Gedanken, das jede Page_table 1024 Einträge hat, die alle auf eine Page Zeigen. Dies bedeut dann aber für jede Page-table 4Kb mehr ram in benutztung. Wieso kann man nicht statt Pointer Auf Pages direkt die Page dort einbauen?
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 Mär 15, 2009 4:10 pm

Naja, würdest du alle Einträge hintereinander (in einer Tabelle) verwalten, dann bräuchtest du:

(4 GB / 4KB) Einträge.
Ein Eintrag ist 32 Bit groß.
Und das für jeden einzelnen Prozess.
Das wäre ziemliche Verschwendung, zumal der Prozess höchstwahrscheinlich nichtmal den ganzen 4GB-großen-Addressraum braucht.

Also macht man das so:
(Für jeden Prozess natürlich)

Ein PageDirectory, dass hat 1024 Einträge.
=> 1024 * 4 Byte = 4KB Platz verbraucht.

Das PageDirectory setzt man zu Beginn auf 0.
Braucht der Prozess nun Platz, dann berechnet man, in welcher PageTable dieser Platz verwaltet werden muss.
Dann erstellt man eine PageTable (4KB groß). Im PageDirectory muss man nun nur einen Eintrag an der entsprechenden Stelle auf die neue Page Table setzen.
In der PageTable muss man den entsprechenden Eintrag für die Page natürlich noch setzen.

Dadurch ist es nich notwendig, alle Seiten zu verwalten (was je Prozess 4 MB benötigen würde...), sondern nur die Seiten, die der Prozess auch wirklich braucht.

MfG
Daniel
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.

Antworten