私はカーネルを書いていて、複数のスタックとヒープを仮想メモリに配置する必要があります (そして望んでいます) が、それらを効率的に配置する方法がわかりません。通常のプログラムはどのようにそれを行うのですか?
スタックとヒープは、32 ビット システムによって提供される限られた仮想メモリにどのように (またはどこに) 配置され、可能な限り多くのスペースが確保されるようになっていますか?
たとえば、単純なプログラムがメモリにロードされると、そのアドレス空間のレイアウトは次のようになります。
[ Code Data BSS Heap-> ... <-Stack ]
この場合、ヒープは仮想メモリが許す限り (たとえばスタックまで) 大きくなる可能性があり、これがほとんどのプログラムでヒープが機能する方法だと思います。定義済みの上限はありません。
多くのプログラムには、仮想アドレス空間のどこかに配置される共有ライブラリがあります。次に、各スレッドに 1 つずつ、複数のスタックを持つマルチスレッド プログラムがあります。また、.NET プログラムには複数のヒープがあり、そのすべてが何らかの方法で拡張できる必要があります。
すべてのヒープとスタックのサイズに事前定義された制限を設けずに、これがどのように合理的に効率的に行われるかわかりません。