Make earlier the initialization of the kernel page table

This commit is contained in:
Zhang Junyang
2024-06-12 07:28:38 +00:00
committed by Tate, Hongliang Tian
parent e210e68920
commit 5c7c1bb39b
2 changed files with 10 additions and 9 deletions

View File

@ -77,14 +77,14 @@ pub fn init() {
mm::page::allocator::init(); mm::page::allocator::init();
let mut boot_pt = mm::get_boot_pt(); let mut boot_pt = mm::get_boot_pt();
let meta_pages = mm::init_page_meta(&mut boot_pt); mm::kspace::init_kernel_page_table(mm::init_page_meta(&mut boot_pt));
mm::misc_init(); mm::misc_init();
trap::init(); trap::init();
arch::after_all_init(); arch::after_all_init();
bus::init(); bus::init();
mm::kspace::init_kernel_page_table(boot_pt, meta_pages); mm::kspace::activate_kernel_page_table(boot_pt);
invoke_ffi_init_funcs(); invoke_ffi_init_funcs();
} }

View File

@ -106,10 +106,7 @@ pub static KERNEL_PAGE_TABLE: Once<PageTable<KernelMode, PageTableEntry, PagingC
/// ///
/// This function should be called before: /// This function should be called before:
/// - any initializer that modifies the kernel page table. /// - any initializer that modifies the kernel page table.
pub fn init_kernel_page_table( pub fn init_kernel_page_table(meta_pages: Vec<Range<Paddr>>) {
boot_pt: BootPageTable<PageTableEntry, PagingConsts>,
meta_pages: Vec<Range<Paddr>>,
) {
info!("Initializing the kernel page table"); info!("Initializing the kernel page table");
let regions = crate::boot::memory_regions(); let regions = crate::boot::memory_regions();
@ -201,14 +198,18 @@ pub fn init_kernel_page_table(
} }
} }
KERNEL_PAGE_TABLE.call_once(|| kpt);
}
pub fn activate_kernel_page_table(boot_pt: BootPageTable<PageTableEntry, PagingConsts>) {
let kpt = KERNEL_PAGE_TABLE
.get()
.expect("The kernel page table is not initialized yet");
// SAFETY: the kernel page table is initialized properly. // SAFETY: the kernel page table is initialized properly.
unsafe { unsafe {
kpt.first_activate_unchecked(); kpt.first_activate_unchecked();
crate::arch::mm::tlb_flush_all_including_global(); crate::arch::mm::tlb_flush_all_including_global();
} }
KERNEL_PAGE_TABLE.call_once(|| kpt);
// SAFETY: the boot page table is OK to be retired now since // SAFETY: the boot page table is OK to be retired now since
// the kernel page table is activated. // the kernel page table is activated.
unsafe { boot_pt.retire() }; unsafe { boot_pt.retire() };