Skip to main content

sparreal_kernel/os/mem/
mod.rs

1use 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}