Speicherverwaltung
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Speicherverwaltung
ICh meine, wenn irgendwer ein Pointer Initialisiert, ihn aber nicht Refernziert, dann muss ich das wissen, um zu verhindern, das er meine GDT zerstört.
Auch wenn irgendwer eine VAriable ohhne malloc() haben will, muss ich das Wissen, um evt. irgenwas spezielles zu machen.
Auch wenn irgendwer eine VAriable ohhne malloc() haben will, muss ich das Wissen, um evt. irgenwas spezielles zu machen.
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Speicherverwaltung
Nein, musst Du nicht. Dann entsteht ein Memory-Leak.cloidnerux hat geschrieben:ICh meine, wenn irgendwer ein Pointer Initialisiert, ihn aber nicht Refernziert, dann muss ich das wissen, um zu verhindern, das er meine GDT zerstört.
Es gibt keine Variablen ohne malloc().cloidnerux hat geschrieben:Auch wenn irgendwer eine VAriable ohhne malloc() haben will, muss ich das Wissen, um evt. irgenwas spezielles zu machen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Speicherverwaltung
Jezt steh ich total auf dem Schlauch.
Heißt das jezt also, das bei jedem Aufruf wie dieser hier:
eine Funktion und/oder Interrupt aufgerufen wird, um dem System evt. mitzuteilen, das irgenwas Speicher haben will??
Ich dann alos nurnoch meine Speicherverwaltung auf diesen INterrupt zu mappen, und es läuft??
Heißt das jezt also, das bei jedem Aufruf wie dieser hier:
Code: Alles auswählen
int var=10;
Ich dann alos nurnoch meine Speicherverwaltung auf diesen INterrupt zu mappen, und es läuft??
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
Re: Speicherverwaltung
Nein. Um soetwas muss sich der Compiler kümmern, da diese Variablen ja auf dem Stack liegen. Bei der Speicherverwaltung geht es um den Heap, dh. um Speicher der mit malloc/free bzw. new/delete angefordert und freigegeben wird.cloidnerux hat geschrieben:Jezt steh ich total auf dem Schlauch.
Heißt das jezt also, das bei jedem Aufruf wie dieser hier:eine Funktion und/oder Interrupt aufgerufen wird, um dem System evt. mitzuteilen, das irgenwas Speicher haben will??Code: Alles auswählen
int var=10;
Ich dann alos nurnoch meine Speicherverwaltung auf diesen INterrupt zu mappen, und es läuft??
Ich hoffe ich liege damit nicht ganz daneben, aber soweit ich das verstanden habe sollte es stimmen

"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)
OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at
OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Speicherverwaltung
Startet ein Programm, so muss das Programm erst mittels malloc() Speicher für den Stack organisieren. Dafür, dass das Programm sich einen Stack besorgt ist entweder das OS verantwortlich, in dem es den Stack an das Program übergibt oder das Programm selbst.Kerli hat geschrieben:Nein. Um soetwas muss sich der Compiler kümmern, da diese Variablen ja auf dem Stack liegen. Bei der Speicherverwaltung geht es um den Heap, dh. um Speicher der mit malloc/free bzw. new/delete angefordert und freigegeben wird.
Das Annehmen und Verarbeiten, bzw. Anfragen nach Stack geschieht in der Startroutine des Programms und das ist bei einem C-Programm nicht main().
main() ist lediglich der Einsprungpunkt, ab dem die Anweisungen des Programmierers abgearbeitet werden. main ist nichts weiter als eine normale Funktion, die von dem Programm gerufen wird, den der Compiler noch drumrum konstruiert.
Diese Startroutinen sorgen zum Beispiel dafür, dass main(argc, argv) die Parameter in kleinen Häppchen bekommt, statt lediglich einen langen String.
Lokale Variablen landen vollständig auf dem Stack, das bedeutet, dass für ein 'int var' kein zusätzliches malloc() erforderlich ist.
Belegt man zuviele lokale Variablen, zum Beispiel, weil man eine Funktion immer wieder rekursiv Aufruf, bekommt man einen "Stack overflow error": Das Programm schreibt über die Größe des Stacks hinaus, schreibt also in Bereiche, in die es nicht reinschreiben darf, also stürzt es ab.
Fazit: das OS muss sich (erstmal) nur um malloc kümmern. Was Du meinst ist Paging und das schreibst Du noch nicht.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Speicherverwaltung
Aber dann müsste der Stack auch im Arbeitsspeicher des Computer ligen, und würde sich mit jeder neuen Variable Vergrößern.
Denn wenn man 1000 VAriablen a 4Byte nutzt, dann kommt amn auch auf 4KB und hat somit ne Page voll.
Da ich selber auch anderweitig Programmiere, weiß ich, das ich selten malloc verwende.
oder es für normale Variablen nicht gilt.
Also wenn Kerli recht hat, dann müsste ich also nur eine Bitmap haben, um die malloc() Funktion auf entsprechende Speicherstellen zu richten.
Nichts weiter??
Denn wenn man 1000 VAriablen a 4Byte nutzt, dann kommt amn auch auf 4KB und hat somit ne Page voll.
Da ich selber auch anderweitig Programmiere, weiß ich, das ich selten malloc verwende.
Würde also heißen, das ich vor jedem Variablenaufruf ein malloc stellen müsste,Xin hat geschrieben:Es gibt keine Variablen ohne malloc().
oder es für normale Variablen nicht gilt.
Also wenn Kerli recht hat, dann müsste ich also nur eine Bitmap haben, um die malloc() Funktion auf entsprechende Speicherstellen zu richten.
Nichts weiter??
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
- Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Re: Speicherverwaltung
Vieles richtig, ein paar Dinge (das OS betreffend) nicht ganz so richtig.
Was klar geworden sein dürfte: Es wird natürlich kein Interrupt/keine Funktion bei jeder Variablenbenutzung verwendet.
Worauf Speicherverwaltung UND Speicherschutz hinauslaufen ist, dass jedes einzelne Programm "scheinbar" 4GB Speicher hat und auf den Speicher des anderen Programms nicht zugreifen kann.
Dazu benötigt es natürlich gewisse Mechanismen...
Dazu gehört einmal die Speicherverwaltung (was in diesem Sinne noch so gut wie überhaupt nichts mit malloc zu tun hat) und Paging/Segmentierung für den Speicherschutz.
Bevor du deinen Speicher schützt, solltest du aber erstmal wissen, welcher Speicher überhaupt benutzt wird.
Du musst also eine Möglichkeit (z.B. durch eine Bitmap) finden, um für jeden Teil (meist 4KB Teile, genannt Frames) speichern zu können, ob es benutzt wird oder frei ist.
Mehr nicht. Um Programme hast du dich im Moment wirklich gar nicht zu kümmern, bekomme erst einmal deinen Speicher in den Griff.
Wenn du eine Möglichkeit gefunden hast, dann implementiere Funktionen, die einzelne Frames (nur ganze Frames, also immer 4 kB !) anfordern und freigeben können.
Über diese Funktionen forderst du ab dem Zeitpunkt deinen Speicher an. Da du nicht jedesmal 4 KB besetzen willst, wenn du nur ein int speichern willst, solltest du dir später einen sog. Heap einbauen, der dann über die Funktionen malloc und free verfügt (die sind NUR für den Kernel, vergiss Programme, davon bist du noch weit weit weg).
Bevor du diesen Heaps implementierst, solltest du dir über Paging Gedanken machen.
Aktiviere es und verwalte es richtig.
Dann kannst du iwo im virtuellen Speicher eine Adresse festlegen, an der der Heap steht. Der Heap ist im Endeffekt nur ein riesiger Platz mit unterschiedlich großen Strukturen drinnen, die einen Datenteil (zum Benutzen) und einen Informationsteil beinhalten. Im Infoteil steht dann z.B. wie groß der Datenbereich ist oder auch ob der Bereich frei ist oder nicht. Dann kannst du freie Bereiche (aneinandergrenzende) zu einem großen freien Bereich zusammenfügen. Willst du nun einen Teil des Speichers, dann musst du neue Strukturen dahinein pflanzen.
Das macht malloc/free.
Für jedes Programm existiert aber ein eigenes malloc/free (sonst könntest du den Speicher nicht schützen).
Die Funktionen muss jedes Programm natürlich nicht bereitstellen, die werden in Form von Libaries mitgegeben. Den Bereich, in dem der Heap liegt festlegen macht meines Wissens nach entweder der Compiler oder es ist Aufgabe des Betriebssystems.
MfG
Daniel
P.S.: Vergiss verdammt nochmal Programme^^
Nochwas:
--------
Lies dir am besten mal im Wiki das Kapitel Stack durch, dann weißt du, wie man Speicher auf dem Stack bekommt 
*lach*
Was klar geworden sein dürfte: Es wird natürlich kein Interrupt/keine Funktion bei jeder Variablenbenutzung verwendet.
Worauf Speicherverwaltung UND Speicherschutz hinauslaufen ist, dass jedes einzelne Programm "scheinbar" 4GB Speicher hat und auf den Speicher des anderen Programms nicht zugreifen kann.
Dazu benötigt es natürlich gewisse Mechanismen...
Dazu gehört einmal die Speicherverwaltung (was in diesem Sinne noch so gut wie überhaupt nichts mit malloc zu tun hat) und Paging/Segmentierung für den Speicherschutz.
Bevor du deinen Speicher schützt, solltest du aber erstmal wissen, welcher Speicher überhaupt benutzt wird.
Du musst also eine Möglichkeit (z.B. durch eine Bitmap) finden, um für jeden Teil (meist 4KB Teile, genannt Frames) speichern zu können, ob es benutzt wird oder frei ist.
Mehr nicht. Um Programme hast du dich im Moment wirklich gar nicht zu kümmern, bekomme erst einmal deinen Speicher in den Griff.
Wenn du eine Möglichkeit gefunden hast, dann implementiere Funktionen, die einzelne Frames (nur ganze Frames, also immer 4 kB !) anfordern und freigeben können.
Über diese Funktionen forderst du ab dem Zeitpunkt deinen Speicher an. Da du nicht jedesmal 4 KB besetzen willst, wenn du nur ein int speichern willst, solltest du dir später einen sog. Heap einbauen, der dann über die Funktionen malloc und free verfügt (die sind NUR für den Kernel, vergiss Programme, davon bist du noch weit weit weg).
Bevor du diesen Heaps implementierst, solltest du dir über Paging Gedanken machen.
Aktiviere es und verwalte es richtig.
Dann kannst du iwo im virtuellen Speicher eine Adresse festlegen, an der der Heap steht. Der Heap ist im Endeffekt nur ein riesiger Platz mit unterschiedlich großen Strukturen drinnen, die einen Datenteil (zum Benutzen) und einen Informationsteil beinhalten. Im Infoteil steht dann z.B. wie groß der Datenbereich ist oder auch ob der Bereich frei ist oder nicht. Dann kannst du freie Bereiche (aneinandergrenzende) zu einem großen freien Bereich zusammenfügen. Willst du nun einen Teil des Speichers, dann musst du neue Strukturen dahinein pflanzen.
Das macht malloc/free.
Für jedes Programm existiert aber ein eigenes malloc/free (sonst könntest du den Speicher nicht schützen).
Die Funktionen muss jedes Programm natürlich nicht bereitstellen, die werden in Form von Libaries mitgegeben. Den Bereich, in dem der Heap liegt festlegen macht meines Wissens nach entweder der Compiler oder es ist Aufgabe des Betriebssystems.
MfG
Daniel
P.S.: Vergiss verdammt nochmal Programme^^

Nochwas:
Das Programm bekommt eine "große leere Wüste" an Speicher, darin ist ein Bereich als Stack festgelegt. Malloc() hat da meines Wissens nach nichts zu schaffen.Startet ein Programm, so muss das Programm erst mittels malloc() Speicher für den Stack organisieren.
--------
Genau das tut der Stack.Aber dann müsste der Stack auch im Arbeitsspeicher des Computer ligen, und würde sich mit jeder neuen Variable Vergrößern.
So sieht eine "normale" Variable aus:Würde also heißen, das ich vor jedem Variablenaufruf ein malloc stellen müsste,
oder es für normale Variablen nicht gilt.
Code: Alles auswählen
00102d0b <test>:
102d0b: 55 push %ebp
102d0c: 89 e5 mov %esp,%ebp
102d0e: 83 ec 08 sub $0x8,%esp #### Hier wird Speicher für die lokale Variable frei
102d11: c7 04 24 05 00 00 00 movl $0x5,(%esp) ### Hier wird in den Speicher geschrieben
102d18: e8 23 fd ff ff call 102a40 <PENX>
102d1d: c9 leave
102d1e: c3 ret
Code: Alles auswählen
void test(void){
int a;
a = 5;
PENX(a);
}

Viel SpaßNichts weiter??

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.
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.
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Speicherverwaltung
OK, werde mich mal daran versuchen
Aber thx das du Mir geholfen hast.
Mann sollte vielleciht doch ein Bsschen an die Zukunft denken und ich akns mir leichter vorstellen.P.S.: Vergiss verdammt nochmal Programme^^
Aber thx das du Mir geholfen hast.
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
- Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Re: Speicherverwaltung
Nein, was passiert, wenn du an Programme denkst ist, dass du anfängst Dinge zu verwechseln. So, wie es bei einem normalen Programm abläuft wird es eben nicht bei deinem Kernel ablaufen können.cloidnerux hat geschrieben:Mann sollte vielleciht doch ein Bsschen an die Zukunft denken und ich akns mir leichter vorstellen.P.S.: Vergiss verdammt nochmal Programme^^
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.
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.
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Speicherverwaltung
JO.
Noch eine kleine Frage:
Muss eine Bitmap volle 4 GB abdecken, oder sich dynamisch nach dem Speicher richten??
Edit: Muss hier noch was Notieren:
Jede Page ist 4.096KB goß
es müssen 4.294.967.296 Byte Verwaltet werden
in 1.048.576 frames unterteilt, das man in
einer Bitmap von der Länge
angelegt werden.
Richtig??
Noch eine kleine Frage:
Muss eine Bitmap volle 4 GB abdecken, oder sich dynamisch nach dem Speicher richten??
Edit: Muss hier noch was Notieren:
Jede Page ist 4.096KB goß
es müssen 4.294.967.296 Byte Verwaltet werden
in 1.048.576 frames unterteilt, das man in
einer Bitmap von der Länge
Code: Alles auswählen
long int bitmap[131.072];
Richtig??
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum