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

Re: about "size" from binutils



Hallo Bjoern,

Bjoern Schliessmann <usenet-mail-0306.20.chr0n0ss@spamgourmet.com> wrote:
> Jörg Sommer wrote:
>
>> Warum unterscheidet man die vom Heap? 
>
> 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 dazu steht in der Manual page, dass es das data?Segment
>> vergrößert. 
>
> 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. Das sind alles nur
aneinander gereihte Bytes. Allein die Art und Weise, wie darauf
zugegriffen wird, gibt dem Ganzen eine Struktur. Und eine feste Art und
Weise des Zugriffs kann (und muss) man sich auch für den Heap vorgeben.

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.

Doch, einen Grund sehe ich. Die Vergrößerung des einen Datenspeichers
kann auf Grund der Fragmentierung im Hauptspeicher nicht beliebig
geschehen. Daher muss es noch eine andere Möglichkeit geben, an Speicher
unabhängig vom data‐Segment zu kommen.

Aber das erklärt nicht, warum es ein bss‐Segment gibt.

>> Es gibt also keinen Heap in dem Sinne. 
>
> Woraus schließt du das? :) Die Größe des data-Segments steht fest,
> sogar schon zur Compilezeit. Der Heap kann während der Laufzeit
> innerhalb gewisser Grenzen (verfügbarer Speicher) beliebig wachsen
> und schrumpfen.

Das data‐Segment kann auch mit Hilfe des brk‐Aufrufs vergrößert und
verkleinert werden.

>> Wobei, da ist noch mmap. Das sollte ein vollkommen anderer
>> Speicherbereich sein.
>
> Wie kommst du jetzt auf mmap? Das ordnet nur einen Adressbereich
> einer Datei zu.

Nein, mmap() muss nicht an eine Datei gebunden sein: MAP_ANONYMOUS.

Soweit ich das sehe, sind brk und mmap die einzigen Systemaufrufe, über
die man vom System Speicher anfordern kann. brk verändert die Größe des
data‐Segments und mmap bekommt Speicher an beliebigen Stellen.

Schöne Grüße, Jörg.
-- 
Was der Bauer nicht kennt, das frisst er nicht. Würde der Städter kennen,
was er frisst, er würde umgehend Bauer werden.
                                                       Oliver Hassencamp


Reply to: