OS
nuta氏によるマイクロカーネル本
筆者製のHinaOSとMINIX・seL4・Hurdを比較しつつマイクロカーネルの設計をみていく
自作OS本とはちょっと違う?
https://github.com/nuta/microkernel-book
HinaOSのブート処理
マイクロカーネルなのでカーネルは最小限の初期化だけを行うだけで(それはそう)あとは vm タスクがやる感じらしい
起動からカーネルまで
kernel/riscv32/boot.Sがjal riscv32_bootする- そもそもこれは
kernel/riscv32/kernel.ld.templateから生成されるリンカスクリプトで 0x8000’0000 に配置されるもので、どうやらこのアドレスから実行が始まるらしい
- そもそもこれは
kernel/riscv32/setup.c:riscv32_boot()が mepc レジスタにriscv32_setup()のアドレスを書き込んでmretによりジャンプ- mepcは Machine Exception Program Counter の略で、[mret は Machine Return from Trap の略]、まあ x86_64 でやるのと似たようなことをしている(mretが pc = mepc を行うのでmepcをいじって任意ジャンプ)
riscv32_setup()はbootinfo.boot_elfに__boot_elfを格納し、kernel_main()を呼ぶ__boot_elfもkernel.ldによってリンクされる(.rodataに置かれるっぽい)
kernel/main.c@kernel_main: 諸々の初期化をして、create_first_task()を呼び、各CPUを初期化して、idle_task()を呼んでおしまいkernel/main.c@create_first_task:bootinfo->boot_elfについて、ヘッダのマジックナンバーを確かめて、task_create("vm", header->e_entry, NULL)という感じで vm タスクを作成し、kernel/task.c@task_create:init_task_struct()で構造体を初期化、双方向連結リストであるactive_tasksに push_back して、task_resume()により RUNNABLE な状態にして runqueueに push_back し、最後に tid を return
kernel/main.c@idle_task:task_switch()してarch_idle()する。後者はRISC-VだとMPロックを解除してwfiで割り込み待ちをする(Wait For Interrupt?)
vm task
以下、特に指定がない限りファイルは servers/vm/ 下にあるものとする
main.c@main: bootfs を初期化、bootfs_image.Sにおいて.incbin BOOTFS_PATHによって埋め込まれたバイナリをいい感じにパースするBOOTFS_PATHはbuild.mkによって指定されており、これは大本のMakefileによって設定される$(bootfs_bin)と同等- この
bootfs_binは Python スクリプトによって生成される
- この