ここから 2021/12/31
メモリマップを boot loader から kernel へ渡す
このあとスタックポインタの張り替えを行うので, static な領域に確保する.
スタックポインタの張り替え
引数を非参照にしていたので, そのサイズによっては引数がレジスタではなくスタックに詰まれ, 張り替えるときに消え去ったりして困る.
結局, 次のようにした.
pub extern "sysv64" fn kernel_main(boot_info: &BootInfo) {
const KERNEL_MAIN_STACK_SIZE: usize = 1024 * 1024;
#[repr(align(16))]
struct Aligned([MaybeUninit<u8>; KERNEL_MAIN_STACK_SIZE]);
static KERNEL_MAIN_STACK: Aligned = Aligned(MaybeUninit::uninit_array());
let stack_bottom = KERNEL_MAIN_STACK.0.as_ptr_range().end;
unsafe {
asm!(
"mov rsp, {}", // change the stack pointer
"mov rdi, {}", // store the arg `boot_info`
"call {}", // stack_tricked(boot_info)
in(reg) stack_bottom,
in(reg) boot_info,
sym stack_tricked
);
}
}
GDT の設定
割り込みでハマった時に既にやっていた.
ページングの設定
なんかよくわからんけれど出来た気がするんだけれど, 出来たか確かめる術がよくわからん.
メモリマネージャ
const generics バンザイという気持ちで const size な bit set を作ったりした. 楽しい.