プログラムローダはtext
、領域を初期化/ロードしdata+bss
ます。これらは、最初に近いプロセスの仮想アドレス空間に割り当てられます。その後、ヒープは (data+bss の後) より大きなアドレスに向かって成長します。スタックは大きなものから下位アドレスに向かって成長します。
スタックポインタの初期値はどのように決まるのだろうか。
プロセスごとの仮想アドレス制限 ( ulimit -v
)を尋ねると、
virtual memory (kbytes, -v) unlimited
さて、これunlimited
は確かに、アドレス指定に使用できる有限数のビットによって課せられる技術的限界を指しています (64 ビット Linux では 48 ビットを思い出す?!)。
では、別の方法が適用されない限りulimit
、スタック ポインターが (vmem の開始 + 2^48 ビット) に大まかに初期化されるのはそれほど単純ですか?