stack について

uClinux 調査環境について - まだ見えない先の
詳解LINUXカーネル p.405
Linux で使用される ELF バイナリは,fs/binfmt_elf.c load_elf_binary() にて setup_arg_pages() を呼び出して stack 領域の vma オブジェクトを生成する.vma が拡張されるのはページフォルト例外時で,例外ハンドラである do_page_fault() から呼ばれる expand_stack() にて行われる.プロセス生成時(exec前)には,スタックポインタは親プロセスと同じ場所を指す (p.125).コピーオンライトによってスタックは複製される.
FLAT バイナリについて - まだ見えない先のにて述べたように,uClinux で使用される FLAT バイナリはfs/binfmt_flat.c load_flat_binary() にて,静的に確保された領域内の mm->start_stack がセットされる.

int expand_stack(struct vm_area_struct *vma, unsigned long address) p.406

noMMU 時は下記になる.

return -ENOMEM;

この関数は,MMU 時はページフォルト時に arch/arm/mm/fault.c __do_page_fault() から呼ばれる.
プロセス起動時に割り当てる stack 領域の増減は行わないため,エラーを返すと考えられる.

void install_arg_page(struct vm_area_struct *vma, struct page *page, unsigned long address)

fs/binfmt_elf.c load_elf_binary() => fs/exec.c setup_arg_page() 経由で呼び出される.コマンドライン引数と環境変数文字列を置いたページフレームを新たに生成した vma に割り当てる.(p.890)
noMMU 時は,この関数が定義されない.noMMU 時はコマンドライン引数と環境変数文字列は load_flat_binary() にて1バイトづつスタック領域にコピーされる.その部分のコメント.

/* copy the arg pages onto the stack, this could be more efficient :-) */

ここでコマンドライン引数と環境変数文字列は,struct linux_binprm *bprm->page に格納されている.