Heapless metadada init

This commit is contained in:
Zhang Junyang 2024-12-16 17:05:41 +08:00 committed by Tate, Hongliang Tian
parent 04511b74c4
commit 508919ca38
2 changed files with 14 additions and 21 deletions

View File

@ -40,7 +40,6 @@
pub(crate) mod kvirt_area; pub(crate) mod kvirt_area;
use alloc::vec::Vec;
use core::ops::Range; use core::ops::Range;
use align_ext::AlignExt; use align_ext::AlignExt;
@ -51,7 +50,7 @@ use super::{
nr_subpage_per_huge, nr_subpage_per_huge,
page::{ page::{
meta::{impl_page_meta, mapping, MetaPageMeta}, meta::{impl_page_meta, mapping, MetaPageMeta},
Page, ContPages, Page,
}, },
page_prop::{CachePolicy, PageFlags, PageProperty, PrivilegedPageFlags}, page_prop::{CachePolicy, PageFlags, PageProperty, PrivilegedPageFlags},
page_table::{KernelMode, PageTable}, page_table::{KernelMode, PageTable},
@ -132,7 +131,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(meta_pages: Vec<Page<MetaPageMeta>>) { pub fn init_kernel_page_table(meta_pages: ContPages<MetaPageMeta>) {
info!("Initializing the kernel page table"); info!("Initializing the kernel page table");
let regions = crate::boot::memory_regions(); let regions = crate::boot::memory_regions();
@ -165,7 +164,7 @@ pub fn init_kernel_page_table(meta_pages: Vec<Page<MetaPageMeta>>) {
// Map the metadata pages. // Map the metadata pages.
{ {
let start_va = mapping::page_to_meta::<PagingConsts>(0); let start_va = mapping::page_to_meta::<PagingConsts>(0);
let from = start_va..start_va + meta_pages.len() * PAGE_SIZE; let from = start_va..start_va + meta_pages.nbytes();
let prop = PageProperty { let prop = PageProperty {
flags: PageFlags::RW, flags: PageFlags::RW,
cache: CachePolicy::Writeback, cache: CachePolicy::Writeback,

View File

@ -35,7 +35,6 @@ pub mod mapping {
} }
} }
use alloc::vec::Vec;
use core::{ use core::{
any::Any, any::Any,
cell::UnsafeCell, cell::UnsafeCell,
@ -46,7 +45,7 @@ use core::{
use log::info; use log::info;
use static_assertions::const_assert_eq; use static_assertions::const_assert_eq;
use super::{allocator, Page}; use super::{allocator, ContPages};
use crate::{ use crate::{
arch::mm::PagingConsts, arch::mm::PagingConsts,
mm::{ mm::{
@ -162,7 +161,7 @@ impl_page_meta!(MetaPageMeta);
/// Initializes the metadata of all physical pages. /// Initializes the metadata of all physical pages.
/// ///
/// The function returns a list of `Page`s containing the metadata. /// The function returns a list of `Page`s containing the metadata.
pub(crate) fn init() -> Vec<Page<MetaPageMeta>> { pub(crate) fn init() -> ContPages<MetaPageMeta> {
let max_paddr = { let max_paddr = {
let regions = crate::boot::memory_regions(); let regions = crate::boot::memory_regions();
regions.iter().map(|r| r.base() + r.len()).max().unwrap() regions.iter().map(|r| r.base() + r.len()).max().unwrap()
@ -180,7 +179,8 @@ pub(crate) fn init() -> Vec<Page<MetaPageMeta>> {
let meta_pages = alloc_meta_pages(num_meta_pages); let meta_pages = alloc_meta_pages(num_meta_pages);
// Map the metadata pages. // Map the metadata pages.
boot_pt::with_borrow(|boot_pt| { boot_pt::with_borrow(|boot_pt| {
for (i, frame_paddr) in meta_pages.iter().enumerate() { for i in 0..num_meta_pages {
let frame_paddr = meta_pages + i * PAGE_SIZE;
let vaddr = mapping::page_to_meta::<PagingConsts>(0) + i * PAGE_SIZE; let vaddr = mapping::page_to_meta::<PagingConsts>(0) + i * PAGE_SIZE;
let prop = PageProperty { let prop = PageProperty {
flags: PageFlags::RW, flags: PageFlags::RW,
@ -193,15 +193,13 @@ pub(crate) fn init() -> Vec<Page<MetaPageMeta>> {
}) })
.unwrap(); .unwrap();
// Now the metadata pages are mapped, we can initialize the metadata. // Now the metadata pages are mapped, we can initialize the metadata.
meta_pages ContPages::from_unused(meta_pages..meta_pages + num_meta_pages * PAGE_SIZE, |_| {
.into_iter() MetaPageMeta {}
.map(|paddr| Page::<MetaPageMeta>::from_unused(paddr, MetaPageMeta::default())) })
.collect()
} }
fn alloc_meta_pages(nframes: usize) -> Vec<Paddr> { fn alloc_meta_pages(nframes: usize) -> Paddr {
let mut meta_pages = Vec::new(); let start_paddr = allocator::PAGE_ALLOCATOR
let start_frame = allocator::PAGE_ALLOCATOR
.get() .get()
.unwrap() .unwrap()
.lock() .lock()
@ -209,11 +207,7 @@ fn alloc_meta_pages(nframes: usize) -> Vec<Paddr> {
.unwrap() .unwrap()
* PAGE_SIZE; * PAGE_SIZE;
// Zero them out as initialization. // Zero them out as initialization.
let vaddr = paddr_to_vaddr(start_frame) as *mut u8; let vaddr = paddr_to_vaddr(start_paddr) as *mut u8;
unsafe { core::ptr::write_bytes(vaddr, 0, PAGE_SIZE * nframes) }; unsafe { core::ptr::write_bytes(vaddr, 0, PAGE_SIZE * nframes) };
for i in 0..nframes { start_paddr
let paddr = start_frame + i * PAGE_SIZE;
meta_pages.push(paddr);
}
meta_pages
} }