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 に移行となります。サボり気味なので進捗微妙ですね。