FLAT バイナリについて


data,bss,heap,stack を含む vma について,kmalloc() で領域を確保するため,確保される実際のサイズが 2 の冪乗となる.FLAT では,一度領域を確保した後で実際のサイズが大きくなっていた場合,そのサイズで do_mremap() しなおす.また,その差分が heap 領域サイズとなる.stack サイズのデフォルト値が 8k なので,少しは heap 領域が確保されると思われる.これらは,fs/binfmt_flat.c load_flat_file() にて行われる.
このように静的に heap 領域が確保されるため uClinux 使用時のユーザ空間での malloc() の実装は,heap を使う brk() の代りに 無名リージョンを確保する mmap() を用いる方法が提案されている.
mm->start_brk は vma->vm_start+data_len+bss_len,mm->context.end_brk は vma->vm_end-stack_len.
heap 領域のサイズについて正確には,data_len+max(bss_len+stack_len, リロケーション情報領域) となる.ファイル中では初期化済みデータの後に bss も stack もなく,代りにリロケーション情報が入っており,リロケーションが実行される際にはこの領域も一度メモリにコピーする必要があるため,実際に確保されるのは max(bss_len+stack_len, リロケーション情報領域) となる.仮りにリロケーション情報の方が大きい場合でも再配置後にサイズを小さくすることはなく,そのままの領域を使う.ここでも heap 領域が大きくなる余地が有る(その他のサイズは固定のため).
参考: http://www.beyondlogic.org/uClinux/bflt.htm