1use crate::mem::pmm::{Pmm, FRAME_SIZE};
8use crate::mem::vmm::Vmm;
9use crate::panic::kernel_panic;
10use crate::types::panic_codes::PanicCode;
11use x86_64::VirtAddr;
12use x86_64::structures::paging::PageTableFlags;
13use linked_list_allocator::LockedHeap;
14
15static HEAP_BASE_ADDRESS: VirtAddr = VirtAddr::new(0xffff_8080_0000_0000);
17
18static HEAP_SIZE: usize = 0x400_000;
20
21#[global_allocator]
23static ALLOCATOR: LockedHeap = LockedHeap::empty();
24
25pub fn init(pmm: &Pmm, vmm: &Vmm) {
30 unsafe {
31 for page in 0..(HEAP_SIZE / FRAME_SIZE as usize) {
32 let phys_page = pmm.alloc().unwrap_or_else(
33 || kernel_panic(
34 PanicCode::OutOfMemory,
35 "Out of memory for heap",
36 )
37 );
38 vmm.map_page(
39 pmm,
40 HEAP_BASE_ADDRESS + (page * FRAME_SIZE as usize) as u64,
41 phys_page,
42 PageTableFlags::PRESENT | PageTableFlags::WRITABLE,
43 );
44 }
45
46 ALLOCATOR.lock().init(HEAP_BASE_ADDRESS.as_mut_ptr::<u8>(), HEAP_SIZE);
47 }
48}