int brk(void *end_data_segment);
void *sbrk(intptr_t increment);
インクリメント 0 で sbrk() を呼び出すと、プログラム ブレークの現在の位置を見つけることができます。
プログラムブレイクとは?0x00ってどこから?
int brk(void *end_data_segment);
void *sbrk(intptr_t increment);
インクリメント 0 で sbrk() を呼び出すと、プログラム ブレークの現在の位置を見つけることができます。
プログラムブレイクとは?0x00ってどこから?
単純化しすぎ:
プロセスには、いくつかのメモリ セグメントがあります。
(もちろん、今日ではもっと複雑です。rodata セグメント、初期化されていないデータ セグメント、mmap 経由で割り当てられたマッピング、vdso などがあります。)
Unix ライクな OS でプログラムがより多くのメモリを要求する従来の方法の 1 つは、データ セグメントのサイズを増やし、メモリ アロケータ (つまりmalloc()
実装) を使用して結果のスペースを管理することです。brk()
これは、データ セグメントが「分割」/終了するポイントを変更するシステム コールを介して行われます。
プログラム ブレークは、プロセスのデータ セグメントの終わりです。別名...
プログラム ブレークは、初期化されていないデータ セグメントの終了後の最初の場所です。
どこから始まるかについては、システムに依存しますが、おそらく 0x00 ではありません。
あなたは、sbrk() は廃止されたシステム コールであり、malloc() を使用する必要があると言っていますが、彼女のドキュメントによると、128 KiB (32 ページ) 未満のメモリを割り当てる場合は malloc() が使用します。そのため、sbrk() を直接使用するべきではありませんが、malloc() はそれを使用します。割り当てが 128 KiB より大きい場合、malloc() はプライベート ページをユーザー空間に割り当てる mmap() を使用します。最後に、少なくとも「プログラム ブレーク」の概念を理解するために、sbrk() を理解することをお勧めします。