Freelist init
This commit is contained in:
parent
da0d1f3d6e
commit
b93f707b0b
24
Cargo.lock
generated
24
Cargo.lock
generated
@ -16,6 +16,12 @@ dependencies = [
|
||||
"spinning_top",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "align-address"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4ac6c08a67736554282858203cd9b7ff53cf55f54c34e85689962748a350cbf0"
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
version = "1.5.0"
|
||||
@ -101,6 +107,17 @@ version = "0.4.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b7ac824320a75a52197e8f2d787f6a38b6718bb6897a35142d749af3c0e8f4fe"
|
||||
|
||||
[[package]]
|
||||
name = "free-list"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "810f338a4ef98f319a279c9199f35d7ec366c6002ca6a8f18fdcc94cfef9afab"
|
||||
dependencies = [
|
||||
"align-address",
|
||||
"smallvec",
|
||||
"x86_64",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gila"
|
||||
version = "0.3.1"
|
||||
@ -109,6 +126,7 @@ dependencies = [
|
||||
"enumflags2",
|
||||
"fdt",
|
||||
"flagset",
|
||||
"free-list",
|
||||
"intbits",
|
||||
"lazy_static",
|
||||
"limine",
|
||||
@ -264,6 +282,12 @@ version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
||||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.15.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
|
||||
|
||||
[[package]]
|
||||
name = "spin"
|
||||
version = "0.9.8"
|
||||
|
@ -8,6 +8,7 @@ acpi = { version = "6.0.1", optional = true }
|
||||
enumflags2 = "0.7.12"
|
||||
fdt = { git = "https://github.com/repnop/fdt", version = "0.2.0-alpha1", optional = true }
|
||||
flagset = "0.4.7"
|
||||
free-list = { version = "0.3.1", features = ["x86_64"] }
|
||||
intbits = "0.2.0"
|
||||
lazy_static = { version = "1.5.0", default-features = false, features = ["spin_no_std"] }
|
||||
limine = "0.5.0"
|
||||
|
@ -26,7 +26,7 @@ pub fn get_mappings() {
|
||||
}
|
||||
);
|
||||
let pml4_addr = Cr3::read_raw().0.start_address();
|
||||
log_info!("Page Map Level 4 Address: 0x{:X}", pml4_addr.as_u64());
|
||||
log_info!("Page Map Level 4 Address: 0x{:x}", pml4_addr.as_u64());
|
||||
log_info!(
|
||||
"Page-Level Write-Through: {}",
|
||||
Cr3::read().1.contains(Cr3Flags::PAGE_LEVEL_WRITETHROUGH)
|
||||
|
@ -8,5 +8,5 @@ pub fn double_fault(info: String) -> ! {
|
||||
}
|
||||
|
||||
pub fn page_fault(addr: usize, info: String) -> ! {
|
||||
panic!("Page fault at 0x{:X}: {}", addr, info);
|
||||
panic!("Page fault at 0x{:x}: {}", addr, info);
|
||||
}
|
||||
|
@ -2,49 +2,21 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
use crate::constants::NEWLINE;
|
||||
use crate::memory::alloc::boxed::Box;
|
||||
use crate::{LOGGER, LogLevel, format, log_info, log_trace};
|
||||
use alloc::string::String;
|
||||
use core::pin::*;
|
||||
use lazy_static::lazy_static;
|
||||
use limine::{
|
||||
memory_map::EntryType,
|
||||
request::{ExecutableAddressRequest, HhdmRequest, MemoryMapRequest, PagingModeRequest},
|
||||
response::HhdmResponse,
|
||||
};
|
||||
use spin::Mutex;
|
||||
use talc::*;
|
||||
use free_list::{FreeList, PageRange, PAGE_SIZE};
|
||||
|
||||
pub extern crate alloc;
|
||||
|
||||
pub struct FreeFrameBlockList {
|
||||
head: Option<Pin<Box<FreeFrameBlock>>>,
|
||||
}
|
||||
|
||||
impl FreeFrameBlockList {
|
||||
pub fn push(&mut self) {
|
||||
if let Some(inner) = &self.head {
|
||||
} else {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// This structure represents a set of
|
||||
// contiguous free page frames
|
||||
pub struct FreeFrameBlock {
|
||||
/// Number of contiguous 4KiB frames this block holds
|
||||
num_frames: usize,
|
||||
/// Pointer to the next block
|
||||
next_block: Option<Pin<Box<FreeFrameBlock>>>,
|
||||
}
|
||||
|
||||
impl FreeFrameBlock {
|
||||
fn num_frames(&self) -> usize {
|
||||
self.num_frames
|
||||
}
|
||||
fn next_block(&self) -> &Option<Pin<Box<FreeFrameBlock>>> {
|
||||
&self.next_block
|
||||
}
|
||||
}
|
||||
static FREELIST: Mutex<FreeList<32>> = Mutex::new(FreeList::<32>::new());
|
||||
|
||||
pub fn log_memory() {
|
||||
// Panic if this is absent. It's needed to set up the GDT and paging
|
||||
@ -60,8 +32,9 @@ pub fn log_memory() {
|
||||
let mut unusable: u64 = 0;
|
||||
for entry in mmap_response.entries() {
|
||||
log_msg.push_str(&format!(
|
||||
"{NEWLINE}\t0x{:X} bytes @ 0x{:X}: {}",
|
||||
"{NEWLINE}\t0x{:x} bytes ({} pages) @ 0x{:x}: {}",
|
||||
entry.length,
|
||||
entry.length as usize / PAGE_SIZE,
|
||||
entry.base,
|
||||
match entry.entry_type {
|
||||
EntryType::ACPI_NVS => {
|
||||
@ -95,6 +68,14 @@ pub fn log_memory() {
|
||||
}
|
||||
EntryType::USABLE => {
|
||||
usable += entry.length;
|
||||
let range = PageRange::from_start_len(entry.base as usize, entry.length as usize).expect("Could not convert map entry to range!");
|
||||
let dealloc_result = unsafe {
|
||||
FREELIST.lock().deallocate(range)
|
||||
};
|
||||
match dealloc_result {
|
||||
Err(e) => log_warning!("Could not deallocate free memory at {}: {}", range, e),
|
||||
Ok(_) => log_trace!("Deallocated free memory at {}", range),
|
||||
}
|
||||
"usable"
|
||||
}
|
||||
_ => "unidentified",
|
||||
@ -104,26 +85,27 @@ pub fn log_memory() {
|
||||
log_trace!("{log_msg}");
|
||||
let total = usable + reclaimable + hardware + unusable;
|
||||
log_info!(
|
||||
"Boot: Memory report: {NEWLINE}\tFree: 0x{usable:X}{NEWLINE}\tAvailable: 0x{reclaimable:X}{NEWLINE}\tUsable: 0x{:X}{NEWLINE}\tHardware: 0x{hardware:X}{NEWLINE}\tUnusable: 0x{unusable:X}{NEWLINE}\tTotal: 0x{total:X}",
|
||||
"Memory report: {NEWLINE}\tFree: 0x{usable:x}{NEWLINE}\tAvailable: 0x{reclaimable:x}{NEWLINE}\tUsable: 0x{:x}{NEWLINE}\tHardware: 0x{hardware:x}{NEWLINE}\tUnusable: 0x{unusable:x}{NEWLINE}\tTotal: 0x{total:x}",
|
||||
usable + reclaimable,
|
||||
);
|
||||
} else {
|
||||
panic!("Memory map contains no entries");
|
||||
}
|
||||
log_info!("Freelist info: 0x{:x} bytes of memory deallocated", FREELIST.lock().free_space());
|
||||
}
|
||||
|
||||
pub fn log_address() {
|
||||
if let Some(resp) = ADDRESS_REQUEST.get_response() {
|
||||
log_info!(
|
||||
"Kernel physical start address: 0x{:X}",
|
||||
"Kernel physical start address: 0x{:x}",
|
||||
resp.physical_base()
|
||||
);
|
||||
log_info!("Kernel virtual start address: 0x{:X}", resp.virtual_base());
|
||||
log_info!("Kernel virtual start address: 0x{:x}", resp.virtual_base());
|
||||
} else {
|
||||
log_warning!("No kernel address response provided.");
|
||||
}
|
||||
log_info!(
|
||||
"Higher Half direct map offset: 0x{:X}",
|
||||
"Higher Half direct map offset: 0x{:x}",
|
||||
HHDM_RESPONSE.offset()
|
||||
);
|
||||
}
|
||||
@ -152,7 +134,7 @@ lazy_static! {
|
||||
}
|
||||
|
||||
// TODO: 10kb kernel heap. Need to figure out how to make this less stupid...
|
||||
static mut ARENA: [u8; 10000] = [0; 10000];
|
||||
static mut ARENA: [u8; 1000000] = [0; 1000000];
|
||||
|
||||
#[global_allocator]
|
||||
static ALLOCATOR: Talck<spin::Mutex<()>, ClaimOnOom> =
|
||||
|
Loading…
Reference in New Issue
Block a user