loadfile関数では、Kernel imageのロードを行ないます。loadfile関数では、複数形式のロードをサポートしていて、"#ifdef"によって切り替えられるようになっています。
#define BOOT_ELF /* ELF形式 imageのロードをサポート */ #define BOOT_AOUT /* AOUT形式 imageのロードをサポート */ #define BOOT_ECOFFE /* COFF形式 imageのロードをサポート */
i386アーキテクチャではOpenBSD 3.4より、ELF formatがサポートされたので、"#ifdef"の定義にBOOT_ELFが定義されています。ここでは、ELFに限定して解析して行く事にします。
elf形式のkernelをロードするときの主な処理は次のようになります。
- 引数から渡されたkernel名のファイルをopenします。
- ファイルからELFヘッダ部分を読込みhdr構造体に格納します
- ヘッダをチェックしてELF形式ならばelf_exec関数をcallします。ここでKernelのloadが行われます。
- 正常に読込まれたらfile descriptorの値を、異常であったなら"-1"を返します。