mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-09 05:16:47 +00:00
Heapless metadada init
This commit is contained in:
parent
04511b74c4
commit
508919ca38
@ -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,
|
||||||
|
@ -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
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user