1

textプロセスの仮想アドレス空間は、プロセスの,dataおよびbssセグメントで始まります。このヒープ割り当てが配置された後、ヒープはより大きなメモリ アドレスに向かって成長します。ただし、ヒープの一部を使用する前に、メモリ ブロックを割り当てる必要がvallocありsegfaultます (など)。

スタックは、仮想アドレス空間の最初の大きなアドレスから小さな値に向かって成長します。私の知る限り、これは仮想メモリの割り当てなしで機能します。ヒープの場合にこれが不可能な場合、事前のメモリ割り当てなしでスタックを使用するにはどうすればよいですか? (同じ線形仮想アドレス空間です。)

これまでのところ、 aiallocaは と同じように実装されていsub esp, <size>ます。しかし、スタックが使用している仮想アドレス空間の領域は、これより前に何らかの形で割り当てられているに違いありませんよね?

4

1 に答える 1

1

何らかの方法でセグメンテーション違反を行いますこれは一種の「怠惰な」最適化です。オペレーティングシステムは、違いが外部から観察できない限り、できる限りごまかします。

ただし、通常の segfault のように、トラップによってシグナルが生成されることはありません (デフォルトではプロセスが強制終了されます)。代わりに、オペレーティング システムは許容スレッド サイズを超えていないことを確認し、ゼロ プールから新しいページを取得します。

Windows では、そのメカニズムは「ガード ページ」という風変わりな名前が付けられていますが、Linux で同様の名前が付けられていることは知りません。いずれにせよ、ガードページは技術的には書き込み保護されたページ (または存在しないページ) であり、OS によって「特別」であると記憶されているため、触れたときに特定のアクションが発生する可能性があります。

mallocこれは、動的割り当て (を呼び出すsbrk) の動作と非常によく似ています。メモリを割り当てても、割り当てられたメモリにアクセスしない限り、実際にはあまり起こりません。発生する唯一のことは、OS がデータ セグメントを拡張したことを「記憶」することです。
ここで障害が発生した場合、OS はページを作成するか、ゼロ プールからそれぞれプルして、ずっとそこにあったふりをします。以前は存在しなかったことを決して知りません。

于 2012-07-23T14:55:26.520 に答える