Chapter 11

8章 メモリ管理

misawa
misawa
2022.01.08に更新

ここから 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 を作ったりした. 楽しい.