[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: about "size" from binutils



Jörg Sommer wrote:
> Bjoern Schliessmann <usenet-mail-0306.20.chr0n0ss@spamgourmet.com>

>> Weil man schon beim Programmstart weiß, dass der Speicherplatz
>> benötigt wird. Deswegen ist es nicht sinnvoll, erst die
>> verhältnismäßig rechenzeitintensive malloc-Funktion darauf
>> anzusetzen, indem man alles einzeln reserviert, sondern gleich
>> einen festen Block zu reservieren und ggf. zu initialisieren.
> 
> Wieso sollte man den Speicher für alle Variablen einzeln
> anfordern? Es reicht doch ein memset(malloc(N), N, 0). 

Und danach noch im Programm mit den Anfangswerten füllen? :) Das ist
wesentlich mehr Aufwand, als einfach vom Betriebssystem das fertige
Datensegment im Speicher zu bekommen.
 
>> Es arbeitet aber mit dem data-Segment (dort packt der Compiler
>> initialisierte Variablen rein), und dessen Struktur steht zur
>> Compilezeit fest. Zur Laufzeit kann da nichts verändert werden,
>> im Gegensatz zu malloc und dem Heap.
> 
> Hää? %-) Es gibt keine feste Struktur in dem Sinne. 

Ich vermute, dass du einen anderen Sinn siehst, als ich meinte.

> Das sind alles nur aneinander gereihte Bytes. Allein die Art und
> Weise, wie darauf zugegriffen wird, gibt dem Ganzen eine Struktur. 

Ach, und rate mal, auf was sich der Programmcode verlässt, wenn er
auf bestimmte Variablen zugreifen will, von denen er nur eine
Speicheradresse hat. Richtig, auf die zur Compilezeit festgelegten
Adressen der Variablen, die im Programmcode hängen.

> Ich sehe nicht, warum es nicht nur einen Datenspeicher geben kann,
> dessen Größe mit sizeof(data)+sizeof(bss) initialisiert wird und
> an dessen Anfang der Loader das data?Segment kopiert. Diesen
> Datenspeicher kann das Programm dann beliebig vergrößern, um den
> Heap zu erzeugen.

Es kann schon sein, dass es bei Linux so implementiert ist (der Heap
wird an vorhandene data-Segmente angehängt), genau weiß ich das
nicht. Jedenfalls sollte man am ursprünglichen Inhalt, der so auch
im Executable liegt, nichts ändern.

> Doch, einen Grund sehe ich. Die Vergrößerung des einen
> Datenspeichers kann auf Grund der Fragmentierung im Hauptspeicher
> nicht beliebig geschehen. 

Oh doch, und zwar mit Hilfe des Prozessors:

http://de.wikipedia.org/wiki/Virtuelle_Speicherverwaltung
 
> Aber das erklärt nicht, warum es ein bss?Segment gibt.

Mir wird es langsam zu religiös. Lies doch einfach mal ein gutes
Buch über den Linux-Kernel und Prozessverwaltung, dann kannst du
dir selbst beantworten, was wirklich besser und einfacher ist, und
was nicht.

Grüße,


Björn

-- 
BOFH excuse #94:

Internet outage


Reply to: