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 » Di Dez 02, 2008 7:38 pm

Die Bitmap kümmert sich nur um den Speicher, den der Computer WIRKLICH hat.

Ein Frame ist 4096 B (= 4 KB) groß.
Wie groß die Bitmap ist kannst du dir dann ausrechen:

Größe des Speichers in KB/ 4 = Anzahl Frames

angenommen du nimmst für jeden Frame ein einzelnes Bit zum darstellen, dann hast du eine Bitmap der Größe:

Anzahl Frames / 32 (Bits pro 4 Byte Integer) = Größe im Speicher (in 4 Bytewerten)

Dann kannst du das theoretisch schreiben:

Code: Alles auswählen

unsigned int bitmap[ **Größe im Speicher** ];
Funktionieren wird das so nicht, da die Größe ja dynamisch ist und nicht in den Kernel kompiliert werden soll.

Nimm also am besten einen Zeiger ans Ende des benutzten Speichers und erhöhe den um den Wert **Größe im Speicher**. Dann bist du am Ende der Bitmap.

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.

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 02, 2008 7:45 pm

Und wie bekomme ich jezt heraus, wei viel Speicher ich habe??
Ich schon mehrfach gelesen, das man irgendwie das Bios anzapfen kann
und so die Größe des Speichers und anderes herausfinden kann.
Nur weiß ich net wie?

Noch eine kleine Frage: Mi was sollte man anfangen? Paging oder Speicherverwaltung?
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 » Di Dez 02, 2008 7:59 pm

Ja, das geht iwie über das BIOS. Wie genau: Keine Ahnung, ich weiß nur, das GRUB das von sich aus schon tut :)
Von GRUB bekommst du einen Multibootinformationsblock, darin sind allmögliche Informationen zum PC.

Paging ohne Speicherverwaltung geht nicht. Bzw ist Schwachsinn.
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 » Di Dez 02, 2008 8:02 pm

Paging ohne Speicherverwaltung geht nicht. Bzw ist Schwachsinn.
Daraus Schließe ich, das man mit Speicherverwaltung anfangen sollte.
Von GRUB bekommst du einen Multibootinformationsblock, darin sind allmögliche Informationen zum PC.
Gut, jezt müsste ich nur noch wissen wie und wo?Sry, hab weder Silberschatz zu Hause, noch steht im i-net was darüber
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 » Di Dez 02, 2008 8:16 pm

cloidnerux hat geschrieben:
Von GRUB bekommst du einen Multibootinformationsblock, darin sind allmögliche Informationen zum PC.
Gut, jezt müsste ich nur noch wissen wie und wo?Sry, hab weder Silberschatz zu Hause, noch steht im i-net was darüber
1. macht nichts
2. ist so nicht richtig ;)

http://www.gnu.org/software/grub/manual ... ion-format

Bevor du zu deiner C-Main Routine springst solltest du das machen: push ebx
dann sollte deine Main Routine folgendermaßen aussehen:

Code: Alles auswählen

void main_what_ever (unsigned int *multiboot_informationen_adresse)
{
//(...)
Dann kannst du, wenn du auf den Zeiger das jeweilige Offset (siehe Link) addierst ganz einfach die einzelnen Felder auslesen :)
Du kannst natürlich auch eine Struktur dafür definieren und das ebx, dass du übergeben bekommst als Zeiger auf eine solche Struktur sehen. Die Struktur muss dann aber auch RICHTIG aufgebaut sein.
=> Mit dem Zeiger ist es einfacher.

Die Informationen solltest du irgendwo speichern oder sie davor bewahren, überschrieben zu 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 » Di Dez 02, 2008 8:43 pm

Danke.
ist so nicht richtig ;)
Jo, Enter wollte net
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 02, 2008 8:54 pm

Also, wie ich es diesem Dokument entnehmen kann,
gibt es zwei short's für den Speicher.
mem_low geht bis 640Kb, und mem_high gehen bis zum "ersten loch im Oberen speicher???".
Wenn ich das richtig verstehe, müsste ich nur mem_high nehmen, um alle Pages zu erfahren,
Da mem_high erst bei 1mb ansetzt und welcher Computer hat weniger als 1Mb speicher.
Ist das Richtig oder muss ich mem_low auch miteinbeziehen??
aber THX
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 » Di Dez 02, 2008 9:10 pm

2 (int)s sind das. Sie sind ja je 4 Byte groß.


So wirklich tauglich, um genau die Speichergröße zu erfahren ist dieser Weg nicht. Besser wäre, glaube ich, die Memmory Map auszulesen. Aber für jetzt würde ich (ich tue es auch) einfach davon ausgehen, dass mem_upper + 1 MB die Speichergröße ist. ;)
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 » Di Dez 02, 2008 9:16 pm

ok 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 » Mo Dez 08, 2008 5:48 pm

Wieder mal ich.
Du hast mal in ner Antwort geschrieben, das ich eine Funktion brauche die mir Speicher Reserviert.
Wie muss diese Funktion speicher reservieren?
Soll sie einfach nur ein Frame sperren und die adresse ausgeben oder wie soll das klappen??
Frage 2: Wie bekomme ich raus wo das ende meines Benutzten speicher ist ??


Also ich werde nochmal zusammen fassen:
1. Man braucht ein Array der form :

Code: Alles auswählen

int speicher_map[ **Größe Speicher in kb/4** ]
in diesem Speichert man ob ein Frame belegt ist oder nicht.
Dann eine funktion malloc die (eine) Frame(s) "sperrt" also als belegt markiert und die adrese zurückgiubt.
Wichtig ist das für das Paging um eine Page in den Speicher zu stellen oder net.
Dadurch kann man den Speicher schützen, indem man einfach nur die Bereiche sperrt in denen IDT, GDT usw liegen.
Wenn dann eine Page nihct mehr gebraucht wird, wird der speicher wieder freigegeben.
Also macht die Speicherverwaltung nihts anderes als nur für Paging Frames zu reseervieren und dan die richtige stelle zu setzen.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten