aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Cunningham <cc@localhost>2022-08-20 12:09:16 -0700
committerChristian Cunningham <cc@localhost>2022-08-20 12:09:16 -0700
commitce4585a574c638f4dfa0b482074d4c3134cab2f9 (patch)
tree538072f14daa252b7b1ed559afe034cec2fddba8 /src
parent917073ec51151596e54fb063b943aab20e584336 (diff)
Allocate in-between
Diffstat (limited to 'src')
-rw-r--r--src/kernel.rs9
-rw-r--r--src/mem/alloc.rs24
2 files changed, 27 insertions, 6 deletions
diff --git a/src/kernel.rs b/src/kernel.rs
index 321f34c..b0c5104 100644
--- a/src/kernel.rs
+++ b/src/kernel.rs
@@ -17,6 +17,7 @@
#![no_std]
extern crate alloc;
+use alloc::boxed::Box;
mod mem;
mod console;
@@ -58,5 +59,13 @@ fn kernel_main() -> ! {
}
}
println!("I should be able to print {} here!", 5);
+ {
+ let a: Box<u8> = Box::new(5);
+ let b: Box<u8> = Box::new(5);
+ let c: Box<(u8,u8,u8)> = Box::new((3,5,8));
+ println!("{:?}", a);
+ println!("{:?}", b);
+ println!("{:?}", c);
+ }
loop { }
}
diff --git a/src/mem/alloc.rs b/src/mem/alloc.rs
index 74f5f1d..ed73e72 100644
--- a/src/mem/alloc.rs
+++ b/src/mem/alloc.rs
@@ -168,11 +168,13 @@ use alloc::alloc::{GlobalAlloc,Layout};
pub struct GrandAllocator { }
const GRAND_ALLOC_SIZE: usize = 64;
+
init_queue!(U8_GRAND_ALLOC, GRAND_ALLOC_SIZE, 0, u8);
init_queue!(U16_GRAND_ALLOC, GRAND_ALLOC_SIZE, 0, u16);
init_queue!(U32_GRAND_ALLOC, GRAND_ALLOC_SIZE, 0, u32);
init_queue!(U64_GRAND_ALLOC, GRAND_ALLOC_SIZE, 0, u64);
init_queue!(U128_GRAND_ALLOC, GRAND_ALLOC_SIZE, 0, u128);
+
impl GrandAllocator {
pub fn init(&self) {
U8_GRAND_ALLOC.init();
@@ -184,7 +186,11 @@ impl GrandAllocator {
}
unsafe impl GlobalAlloc for GrandAllocator {
+ /// # Allocator
+ ///
+ /// Allocate the fixed size chunks
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
+ crate::println!("Size: {}", layout.size());
match layout.size() {
1 => {
match U8_GRAND_ALLOC.alloc() {
@@ -206,7 +212,7 @@ unsafe impl GlobalAlloc for GrandAllocator {
}
}
}
- 4 => {
+ 3..4 => {
match U32_GRAND_ALLOC.alloc() {
None => {
panic!("No cells to allocate!");
@@ -216,7 +222,7 @@ unsafe impl GlobalAlloc for GrandAllocator {
}
}
}
- 8 => {
+ 5..8 => {
match U64_GRAND_ALLOC.alloc() {
None => {
panic!("No cells to allocate!");
@@ -226,7 +232,7 @@ unsafe impl GlobalAlloc for GrandAllocator {
}
}
}
- 16 => {
+ 9..16 => {
match U128_GRAND_ALLOC.alloc() {
None => {
panic!("No cells to allocate!");
@@ -242,6 +248,9 @@ unsafe impl GlobalAlloc for GrandAllocator {
}
}
+ /// # Deallocate
+ ///
+ /// Deallocate the fixed size chunks by searching for them
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
match layout.size() {
1 => {
@@ -266,7 +275,7 @@ unsafe impl GlobalAlloc for GrandAllocator {
panic!("Didn't deallocate!");
});
}
- 4 => {
+ 3..4 => {
U32_GRAND_ALLOC.inner.lock(|pool| {
for idx in 2..pool.len() {
if pool[idx].ptr() == ptr {
@@ -277,7 +286,7 @@ unsafe impl GlobalAlloc for GrandAllocator {
panic!("Didn't deallocate!");
});
}
- 8 => {
+ 5..8 => {
U64_GRAND_ALLOC.inner.lock(|pool| {
for idx in 2..pool.len() {
if pool[idx].ptr() == ptr {
@@ -288,7 +297,7 @@ unsafe impl GlobalAlloc for GrandAllocator {
panic!("Didn't deallocate!");
});
}
- 16 => {
+ 9..16 => {
U128_GRAND_ALLOC.inner.lock(|pool| {
for idx in 2..pool.len() {
if pool[idx].ptr() == ptr {
@@ -306,5 +315,8 @@ unsafe impl GlobalAlloc for GrandAllocator {
}
}
+/// # Grand Allocator
+///
+/// The allocator of allocators. It hands out fixed sized memory chunks.
#[global_allocator]
pub static ALLOCATOR: GrandAllocator = GrandAllocator{};