mirror of
https://github.com/wichtounet/thor-os.git
synced 2025-09-14 06:56:51 -04:00
Protect kalloc
This commit is contained in:
parent
78554b3242
commit
ae0b2463a5
@ -10,6 +10,7 @@
|
|||||||
#include "physical_allocator.hpp"
|
#include "physical_allocator.hpp"
|
||||||
#include "paging.hpp"
|
#include "paging.hpp"
|
||||||
#include "e820.hpp"
|
#include "e820.hpp"
|
||||||
|
#include "mutex.hpp"
|
||||||
|
|
||||||
#include "fs/sysfs.hpp"
|
#include "fs/sysfs.hpp"
|
||||||
|
|
||||||
@ -20,6 +21,8 @@ namespace {
|
|||||||
const bool DEBUG_MALLOC = false;
|
const bool DEBUG_MALLOC = false;
|
||||||
const bool TRACE_MALLOC = false;
|
const bool TRACE_MALLOC = false;
|
||||||
|
|
||||||
|
mutex lock;
|
||||||
|
|
||||||
size_t _used_memory;
|
size_t _used_memory;
|
||||||
size_t _allocated_memory;
|
size_t _allocated_memory;
|
||||||
|
|
||||||
@ -320,6 +323,18 @@ std::string sysfs_used(){
|
|||||||
return std::to_string(kalloc::used_memory());
|
return std::to_string(kalloc::used_memory());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void malloc_lock(){
|
||||||
|
if(scheduler::is_started()){
|
||||||
|
lock.acquire();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void malloc_unlock(){
|
||||||
|
if(scheduler::is_started()){
|
||||||
|
lock.release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} //end of anonymous namespace
|
} //end of anonymous namespace
|
||||||
|
|
||||||
void kalloc::init(){
|
void kalloc::init(){
|
||||||
@ -334,9 +349,13 @@ void kalloc::finalize(){
|
|||||||
sysfs::set_dynamic_value("/sys/", "/memory/dynamic/free", &sysfs_free);
|
sysfs::set_dynamic_value("/sys/", "/memory/dynamic/free", &sysfs_free);
|
||||||
sysfs::set_dynamic_value("/sys/", "/memory/dynamic/used", &sysfs_used);
|
sysfs::set_dynamic_value("/sys/", "/memory/dynamic/used", &sysfs_used);
|
||||||
sysfs::set_dynamic_value("/sys/", "/memory/dynamic/allocated", &sysfs_allocated);
|
sysfs::set_dynamic_value("/sys/", "/memory/dynamic/allocated", &sysfs_allocated);
|
||||||
|
|
||||||
|
lock.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
void* kalloc::k_malloc(uint64_t bytes){
|
void* kalloc::k_malloc(uint64_t bytes){
|
||||||
|
malloc_lock();
|
||||||
|
|
||||||
auto current = malloc_head->next();
|
auto current = malloc_head->next();
|
||||||
|
|
||||||
//Try not to create too small blocks
|
//Try not to create too small blocks
|
||||||
@ -417,10 +436,14 @@ void* kalloc::k_malloc(uint64_t bytes){
|
|||||||
printf("m %u(%u) %h ", bytes, current->size(), block_start);
|
printf("m %u(%u) %h ", bytes, current->size(), block_start);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
malloc_unlock();
|
||||||
|
|
||||||
return reinterpret_cast<void*>(block_start);
|
return reinterpret_cast<void*>(block_start);
|
||||||
}
|
}
|
||||||
|
|
||||||
void kalloc::k_free(void* block){
|
void kalloc::k_free(void* block){
|
||||||
|
malloc_lock();
|
||||||
|
|
||||||
auto free_header = reinterpret_cast<malloc_header_chunk*>(
|
auto free_header = reinterpret_cast<malloc_header_chunk*>(
|
||||||
reinterpret_cast<uintptr_t>(block) - sizeof(malloc_header_chunk));
|
reinterpret_cast<uintptr_t>(block) - sizeof(malloc_header_chunk));
|
||||||
|
|
||||||
@ -442,6 +465,8 @@ void kalloc::k_free(void* block){
|
|||||||
insert_after(malloc_head, free_header);
|
insert_after(malloc_head, free_header);
|
||||||
|
|
||||||
debug_malloc<DEBUG_MALLOC>("after free");
|
debug_malloc<DEBUG_MALLOC>("after free");
|
||||||
|
|
||||||
|
malloc_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t kalloc::allocated_memory(){
|
size_t kalloc::allocated_memory(){
|
||||||
|
Loading…
x
Reference in New Issue
Block a user