kernel_init.rs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. use crate::kernel::mem::{GlobalPageAlloc, RawPage};
  2. use eonix_hal::{
  3. bootstrap::BootStrapData,
  4. mm::{ArchMemory, ArchPagingMode, GLOBAL_PAGE_TABLE},
  5. traits::mm::Memory,
  6. };
  7. use eonix_mm::{
  8. address::{Addr as _, AddrOps as _, VAddr, VRange},
  9. page_table::{PageAttribute, PagingMode as _, PTE},
  10. paging::{Page as GenericPage, PAGE_SIZE, PFN},
  11. };
  12. pub fn setup_memory(data: &mut BootStrapData) {
  13. let addr_max = ArchMemory::present_ram()
  14. .map(|range| range.end())
  15. .max()
  16. .expect("No free memory");
  17. let pfn_max = PFN::from(addr_max.ceil());
  18. let len_bytes_page_array = usize::from(pfn_max) * size_of::<RawPage>();
  19. let count_pages = len_bytes_page_array.div_ceil(PAGE_SIZE);
  20. let alloc = data.get_alloc().unwrap();
  21. // Map kernel page array.
  22. const V_KERNEL_PAGE_ARRAY_START: VAddr = VAddr::from(0xffffff8040000000);
  23. for pte in GLOBAL_PAGE_TABLE.iter_kernel_in(
  24. VRange::from(V_KERNEL_PAGE_ARRAY_START).grow(PAGE_SIZE * count_pages),
  25. ArchPagingMode::LEVELS,
  26. &alloc,
  27. ) {
  28. let attr = PageAttribute::PRESENT
  29. | PageAttribute::WRITE
  30. | PageAttribute::READ
  31. | PageAttribute::HUGE
  32. | PageAttribute::GLOBAL;
  33. let page = GenericPage::alloc_in(&alloc);
  34. pte.set(page.into_raw(), attr.into());
  35. }
  36. unsafe {
  37. // SAFETY: We've just mapped the area with sufficient length.
  38. core::ptr::write_bytes(
  39. V_KERNEL_PAGE_ARRAY_START.addr() as *mut (),
  40. 0,
  41. count_pages * PAGE_SIZE,
  42. );
  43. }
  44. for range in ArchMemory::present_ram() {
  45. GlobalPageAlloc::mark_present(range);
  46. }
  47. if let Some(early_alloc) = data.take_alloc() {
  48. for range in early_alloc.into_iter() {
  49. unsafe {
  50. // SAFETY: We are in system initialization procedure where preemption is disabled.
  51. GlobalPageAlloc::add_pages(range);
  52. }
  53. }
  54. }
  55. }