6.828: Operating System Engineering (80)
ええと LEC5 は exec なドキュメント読めとか唐突なテーマだったりしてます。で、課題として xv6 で例えば #!/bin/sh なスクリプトが exec された場合の実装せよ的 exercise が提示されております。
仕方ないので
カンニングを。linux-linaro-2.6.39 のツリーを -name '#!' で M-x find-grep したら fs/binfmt_script.c が釣れた。この中に定義されている load_script という手続きの名前で再度 M-x find-grep してみます。
find . -type f -print0 | xargs -0 -e grep -nH -e load_script Binary file ./GRTAGS matches ./fs/binfmt_script.c:17:static int load_script(struct linux_binprm *bprm,struct pt_regs *regs) ./fs/binfmt_script.c:103: .load_binary = load_script, Binary file ./GTAGS matches ./drivers/dma/imx-sdma.c:383:static int sdma_load_script(struct sdma_engine *sdma, void *buf, int size, ./drivers/dma/imx-sdma.c:1143: sdma_load_script(sdma, ram_code,
むむ。fs/binfmt_script.c の 103 行周辺の記述が以下。
static struct linux_binfmt script_format = { .module = THIS_MODULE, .load_binary = load_script, }; static int __init init_script_binfmt(void) { return register_binfmt(&script_format); }
とりあえず register_binfmt で M-x find-grep してみます。と、定義元は fs/exec.c なのか。あるいは include/linux/binfmts.h で inline で云々。linux_binfmt 構造体なナニがリストの末端に追加されてるイメージで良いのかどうか。
コールグラフ的に
sys_execve() から search_binary_handler() が呼び出されてその中で formats なリストを手繰りながら load_binary な属性に設定された手続きを呼び出して、という実装な模様。
たしかに
最初、shell 側で制御するのでは? って思ったのですが、よく考えたら shell 側では folk して exec してるだけなのですよね。なので exec の中で云々な必要があるのか。
ということで
ようやく LEC6 に移行となります。サボり気味なので進捗微妙ですね。