あなたが投稿した図では、「ブレーク」( and によって操作されるアドレスbrk
)sbrk
は、ヒープの上部にある点線です。

あなたが読んだドキュメントでは、これを「データセグメント」の終わりとして説明しています。これは、従来の (事前共有ライブラリ、事前mmap
) Unix ではデータセグメントがヒープと連続していたためです。プログラムの開始前に、カーネルは「テキスト」および「データ」ブロックをアドレス 0 から RAM にロードし (実際にはアドレス 0 の少し上にあるため、NULL ポインターは実際には何も指していません)、ブレーク アドレスを次のように設定します。データセグメントの終わり。図に示すように、の最初の呼び出しmalloc
は、分割を移動し、データ セグメントの先頭と新しいより高いブレーク アドレスの間sbrk
にヒープを作成するために使用し、その後の の使用は、それを使用してヒープを大きくします。必要に応じて。malloc
その間、スタックはメモリの一番上から始まり、下に向かって成長します。スタックを大きくするために明示的なシステム コールは必要ありません。可能な限り多くのRAMが割り当てられた状態で開始するか(これは従来のアプローチでした)、スタックの下に予約済みアドレスの領域があり、そこに書き込みの試みに気付いたときにカーネルが自動的にRAMを割り当てます。 (これは現代のアプローチです)。いずれにせよ、スタックに使用できるアドレス空間の下部に「ガード」領域がある場合とない場合があります。この領域が存在する場合 (最新のシステムはすべてこれを行います)、永久にマップ解除されます。いずれかの場合スタックまたはヒープがそれに成長しようとすると、セグメンテーション違反が発生します。ただし、伝統的に、カーネルは境界を強制しようとはしませんでした。スタックがヒープに成長したり、ヒープがスタックに成長したりする可能性があり、どちらの方法でも互いのデータを走り書きし、プログラムがクラッシュします。運が良ければ、すぐにクラッシュします。
この図の 512GB という数字がどこから来たのかわかりません。これは 64 ビットの仮想アドレス空間を意味し、そこにある非常に単純なメモリ マップとは矛盾します。実際の 64 ビット アドレス空間は、次のようになります。

Legend: t: text, d: data, b: BSS
This is not remotely to scale, and it shouldn't be interpreted as exactly how any given OS does stuff (after I drew it I discovered that Linux actually puts the executable much closer to address zero than I thought it did, and the shared libraries at surprisingly high addresses). The black regions of this diagram are unmapped -- any access causes an immediate segfault -- and they are gigantic relative to the gray areas. The light-gray regions are the program and its shared libraries (there can be dozens of shared libraries); each has an independent text and data segment (and "bss" segment, which also contains global data but is initialized to all-bits-zero rather than taking up space in the executable or library on disk). The heap is no longer necessarily continous with the executable's data segment -- I drew it that way, but it looks like Linux, at least, doesn't do that. The stack is no longer pegged to the top of the virtual address space, and the distance between the heap and the stack is so enormous that you don't have to worry about crossing it.
ブレークはまだヒープの上限です。しかし、私が示していなかったのは、.mmap
の代わりにbrk
. brk
(OS は、衝突しないように、これらを領域から遠ざけようとします。)