8
int brk(void *end_data_segment);
void *sbrk(intptr_t increment);

インクリメント 0 で sbrk() を呼び出すと、プログラム ブレークの現在の位置を見つけることができます。

プログラムブレイクとは?0x00ってどこから?

4

4 に答える 4

7

単純化しすぎ:

プロセスには、いくつかのメモリ セグメントがあります。

  • 実行するコードを含むコード (テキスト) セグメント。
  • コンパイラが認識しているデータ (グローバルおよび静的) を含むデータ セグメント。
  • (ドラムロール...) スタックを含むスタック セグメント。

(もちろん、今日ではもっと複雑です。rodata セグメント、初期化されていないデータ セグメント、mmap 経由で割り当てられたマッピング、vdso などがあります。)

Unix ライクな OS でプログラムがより多くのメモリを要求する従来の方法の 1 つは、データ セグメントのサイズを増やし、メモリ アロケータ (つまりmalloc()実装) を使用して結果のスペースを管理することです。brk()これは、データ セグメントが「分割」/終了するポイントを変更するシステム コールを介して行われます。

于 2011-06-14T22:54:54.273 に答える
5

プログラム ブレークは、プロセスのデータ セグメントの終わりです。別名...

プログラム ブレークは、初期化されていないデータ セグメントの終了後の最初の場所です。

どこから始まるかについては、システムに依存しますが、おそらく 0x00 ではありません。

于 2011-06-14T01:33:57.683 に答える
2

あなたは、sbrk() は廃止されたシステム コールであり、malloc() を使用する必要があると言っていますが、彼女のドキュメントによると、128 KiB (32 ページ) 未満のメモリを割り当てる場合は malloc() が使用します。そのため、sbrk() を直接使用するべきではありませんが、malloc() はそれを使用します。割り当てが 128 KiB より大きい場合、malloc() はプライベート ページをユーザー空間に割り当てる mmap() を使用します。最後に、少なくとも「プログラム ブレーク」の概念を理解するために、sbrk() を理解することをお勧めします。

于 2017-11-02T20:16:31.423 に答える