6.828: Operating System Engineering (90)

最近時間が取れてなかったのだけれど、なんとなく可能なリソースが確保できたので確認してみます。
とりあえず exercise に取りかかる前に直上の文章眺めているのですが、ファイルシステム持ってないのでカーネルに実行ファイルを組み込んでしまえ的ソリューションな記載がありますね。
とは言え make な仕掛けがイマイチ分からぬ。
xv6 の中で動く実行ファイル用のソースは user/ 配下に、って user/Makefrag 見ても普通に実行ファイル吐いてるだけだな、ってテキストに

The Lab 3 GNUmakefile generates a number of binary images in the obj/user/ directory. If you look at kern/Makefrag, you will notice some magic that "links" these binaries directly into the kernel executable as if they were .o files. The -b binary option on the linker command line causes these files to be linked in as "raw" uninterpreted binary files rather than as regular .o files produced by the compiler.

って書いてあるなorz
kern/Makefrag 見てみると

KERN_BINFILES :=	user/hello \
			user/buggyhello \
			user/buggyhello2 \
			user/evilhello \
			user/testbss \
			user/divzero \
			user/breakpoint \
			user/softint \
			user/badsegment \
			user/faultread \
			user/faultreadkernel \
			user/faultwrite \
			user/faultwritekernel

って列挙されてて

# How to build the kernel itself
$(OBJDIR)/kern/kernel: $(KERN_OBJFILES) $(KERN_BINFILES) kern/kernel.ld
	@echo + ld $@
	$(V)$(LD) -o $@ $(KERN_LDFLAGS) $(KERN_OBJFILES) $(GCC_LIB) -b binary $(KERN_BINFILES)
	$(V)$(OBJDUMP) -S $@ > $@.asm
	$(V)$(NM) -n $@ > $@.sym

という形で -b binary としてそれぞれの実行ファイルが指定されてます。ええと $(OBJDIR)/kern/kernel.sym に nm な結果が出力されておる、と。そこには確かに

00000008 a CODE_SEL
00000010 a DATA_SEL
00007813 A _binary_obj_user_hello_size
00007815 A _binary_obj_user_softint_size
00007817 A _binary_obj_user_evilhello_size
00007817 A _binary_obj_user_faultread_size
00007818 A _binary_obj_user_badsegment_size
00007818 A _binary_obj_user_breakpoint_size
00007818 A _binary_obj_user_buggyhello_size
00007818 A _binary_obj_user_faultwrite_size
0000781d A _binary_obj_user_faultreadkernel_size
0000781e A _binary_obj_user_faultwritekernel_size
0000782a A _binary_obj_user_divzero_size
0000782e A _binary_obj_user_testbss_size
00007833 A _binary_obj_user_buggyhello2_size
efc00000 A vpt
effbf000 A vpd

だったり

f0117358 D idt_pd
f0117360 D _binary_obj_user_hello_start
f011eb73 D _binary_obj_user_buggyhello_start
f011eb73 D _binary_obj_user_hello_end
f012638b D _binary_obj_user_buggyhello2_start
f012638b D _binary_obj_user_buggyhello_end
f012dbbe D _binary_obj_user_buggyhello2_end
f012dbbe D _binary_obj_user_evilhello_start
f01353d5 D _binary_obj_user_evilhello_end
f01353d5 D _binary_obj_user_testbss_start
f013cc03 D _binary_obj_user_divzero_start
f013cc03 D _binary_obj_user_testbss_end
f014442d D _binary_obj_user_breakpoint_start
f014442d D _binary_obj_user_divzero_end
f014bc45 D _binary_obj_user_breakpoint_end
f014bc45 D _binary_obj_user_softint_start
f015345a D _binary_obj_user_badsegment_start
f015345a D _binary_obj_user_softint_end
f015ac72 D _binary_obj_user_badsegment_end
f015ac72 D _binary_obj_user_faultread_start
f0162489 D _binary_obj_user_faultread_end
f0162489 D _binary_obj_user_faultreadkernel_start
f0169ca6 D _binary_obj_user_faultreadkernel_end
f0169ca6 D _binary_obj_user_faultwrite_start
f01714be D _binary_obj_user_faultwrite_end
f01714be D _binary_obj_user_faultwritekernel_start
f0178cdc D _binary_obj_user_faultwritekernel_end
f0178cdc A edata

みたいなナニが出力されてます。こいつらを読み込んで実行してるのか。

exercise とゆーことで kern/env.c の手続き定義の記述を追加云々とあります。丁寧なコメントがあるので何とかなりそげ。

// Mark all environments in 'envs' as free, set their env_ids to 0,
// and insert them into the env_free_list.
// Insert in reverse order, so that the first call to env_alloc()
// returns envs[0].
//
void
env_init(void)
{
    // LAB 3: Your code here.
}

ちなみに envs は exercise 1. にて以下な形で領域を確保してますね。

    envs = boot_alloc(NENV*sizeof(struct Env), PGSIZE);

あと、env_free_list ですが env.c で以下な定義。

static struct Env_list env_free_list;	// Free list

Env_list の定義は env.h で以下ですね。

LIST_HEAD(Env_list, Env);		// Declares 'struct Env_list'

で、LIST_HEAD というマクロは queue.h で定義されてて以下です。

#define	LIST_HEAD(name, type)						\
struct name {								\
	struct type *lh_first;	/* first element */			\
}

置き換えれば以下なのかな。

struct Env_list {
    struct Env *ls_first;
};

Env 構造体の中にポインタな属性があるのでそれを手繰るのかな。とりあえず時間切れなので以降はまた、ということで。