mirror of
https://github.com/sgmarz/osblog.git
synced 2024-11-24 02:16:19 +04:00
Added kzmalloc for zeroing allocated memory
This commit is contained in:
parent
19eac921db
commit
99b98111a4
@ -82,6 +82,19 @@ pub fn init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Allocate sub-page level allocation based on bytes and zero the memory
|
||||||
|
pub fn kzmalloc(sz: usize) -> *mut u8 {
|
||||||
|
let size = align_val(sz, 3) + size_of::<AllocList>();
|
||||||
|
let ret = kmalloc(size);
|
||||||
|
|
||||||
|
for i in 0..size {
|
||||||
|
unsafe {
|
||||||
|
(*ret) = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ret
|
||||||
|
}
|
||||||
|
|
||||||
/// Allocate sub-page level allocation based on bytes
|
/// Allocate sub-page level allocation based on bytes
|
||||||
pub fn kmalloc(sz: usize) -> *mut u8 {
|
pub fn kmalloc(sz: usize) -> *mut u8 {
|
||||||
unsafe {
|
unsafe {
|
||||||
@ -142,12 +155,25 @@ pub fn coalesce() {
|
|||||||
let next = (head as *mut u8).add((*head).get_size())
|
let next = (head as *mut u8).add((*head).get_size())
|
||||||
as *mut AllocList;
|
as *mut AllocList;
|
||||||
if (*head).get_size() == 0 {
|
if (*head).get_size() == 0 {
|
||||||
|
// If this happens, then we have a bad heap
|
||||||
|
// (double free or something). However, that
|
||||||
|
// will cause an infinite loop since the next
|
||||||
|
// pointer will never move beyond the current
|
||||||
|
// location.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if next >= tail {
|
else if next >= tail {
|
||||||
|
// We calculated the next by using the size
|
||||||
|
// given as get_size(), however this could push
|
||||||
|
// us past the tail. In that case, the size is
|
||||||
|
// wrong, hence we break and stop doing what we
|
||||||
|
// need to do.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (*head).is_free() && (*next).is_free() {
|
else if (*head).is_free() && (*next).is_free() {
|
||||||
|
// This means we have adjacent blocks needing to
|
||||||
|
// be freed. So, we combine them into one
|
||||||
|
// allocation.
|
||||||
(*head).set_size(
|
(*head).set_size(
|
||||||
(*head).get_size()
|
(*head).get_size()
|
||||||
+ (*next).get_size(),
|
+ (*next).get_size(),
|
||||||
@ -200,7 +226,7 @@ unsafe impl GlobalAlloc for OsGlobalAlloc {
|
|||||||
// We align to the next page size so that when
|
// We align to the next page size so that when
|
||||||
// we divide by PAGE_SIZE, we get exactly the number
|
// we divide by PAGE_SIZE, we get exactly the number
|
||||||
// of pages necessary.
|
// of pages necessary.
|
||||||
kmalloc(layout.size())
|
kzmalloc(layout.size())
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn dealloc(&self, ptr: *mut u8, _layout: Layout) {
|
unsafe fn dealloc(&self, ptr: *mut u8, _layout: Layout) {
|
||||||
|
Loading…
Reference in New Issue
Block a user