sparreal_kernel/os/mem/
mod.rs1use byte_unit::{Byte, UnitType};
2use kernutil::memory::MemoryDescriptor;
3
4use crate::os::mem::address::{PhysAddr, VirtAddr};
5
6pub use allocator::{KernelAllocator, KernelMemoryAllocator, kernel_memory_allocator};
7
8mod address;
9mod allocator;
10pub(crate) mod paging;
11
12pub use paging::ioremap;
13
14pub fn page_size() -> usize {
15 crate::hal::al::memory::page_size()
16}
17
18pub(crate) fn __va(addr: PhysAddr) -> VirtAddr {
19 crate::hal::al::memory::_va(addr)
20}
21
22pub(crate) fn __io(addr: PhysAddr) -> VirtAddr {
23 crate::hal::al::memory::_io(addr)
24}
25
26pub(crate) fn __kimage_va(addr: PhysAddr) -> VirtAddr {
27 let offset = crate::hal::al::memory::kimage_offset();
28 VirtAddr::new((addr.raw() as isize - offset) as usize)
29}
30
31pub(crate) fn init_heap(regions: &[MemoryDescriptor]) {
32 for region in regions {
33 if region.memory_type == kernutil::memory::MemoryType::Free {
34 let start = PhysAddr::new(region.physical_start).align_up(page_size());
35 let end =
36 PhysAddr::new(region.physical_start + region.size_in_bytes).align_down(page_size());
37 let size = end - start;
38 if size == 0 {
39 continue;
40 }
41 let byte_count = Byte::from(size);
42 let adjusted_byte = byte_count.get_appropriate_unit(UnitType::Binary);
43 let start: VirtAddr = __va(start);
44 debug!(
45 "Alloc add: {} - {} ({:.2})",
46 start,
47 start + size,
48 adjusted_byte
49 );
50
51 #[cfg(target_os = "none")]
52 {
53 let memory = unsafe { core::slice::from_raw_parts_mut(start.into(), size) };
54
55 allocator::kernel_memory_allocator().add_memory_region(memory);
56 }
57 }
58 }
59}