fix/kernel: Fixed kfree to be more safe
This commit is contained in:
parent
d0e4149de5
commit
b41cc11e39
4 changed files with 81 additions and 36 deletions
|
@ -57,6 +57,7 @@ IMPLICIT_SRCS :=
|
|||
ifneq ($(MAKECMDGOALS),menuconfig)
|
||||
ifeq ($(CONFIG_KERNEL_HEAP_FF),y)
|
||||
IMPLICIT_SRCS += src/mm/heap/ff.c
|
||||
CFLAGS += -DFF_POOL_SIZE=$(CONFIG_KERNEL_HEAP_POOL_SIZE)
|
||||
else
|
||||
$(error Error: No heap algorithm was defined. Please run "make menuconfig" and select one.)
|
||||
endif
|
||||
|
|
|
@ -1,39 +1,54 @@
|
|||
mainmenu "EMK Build Configuration"
|
||||
|
||||
choice
|
||||
menu "Build"
|
||||
choice
|
||||
prompt "Build Mode"
|
||||
default BUILD_MODE_DEBUG
|
||||
|
||||
config BUILD_MODE_DEBUG
|
||||
config BUILD_MODE_DEBUG
|
||||
bool "Debug"
|
||||
help
|
||||
Build with debug symbols and no optimizations.
|
||||
|
||||
config BUILD_MODE_RELEASE
|
||||
config BUILD_MODE_RELEASE
|
||||
bool "Release"
|
||||
help
|
||||
Build with optimizations and no debug symbols.
|
||||
|
||||
endchoice
|
||||
endchoice
|
||||
endmenu
|
||||
|
||||
choice
|
||||
menu "Memory"
|
||||
choice
|
||||
prompt "Kernel Heap Algorithm"
|
||||
default KERNEL_HEAP_FF
|
||||
|
||||
config KERNEL_HEAP_FF
|
||||
config KERNEL_HEAP_FF
|
||||
bool "First-Fit"
|
||||
help
|
||||
Use the First-Fit memory allocation algorithm (ff.c).
|
||||
|
||||
endchoice
|
||||
endchoice
|
||||
|
||||
config ENABLE_FLANTERM
|
||||
bool "Enable Flanterm Support"
|
||||
config KERNEL_HEAP_POOL_SIZE
|
||||
int "Pool Size (Pages)"
|
||||
default 512
|
||||
depends on KERNEL_HEAP_FF
|
||||
help
|
||||
Includes support for the Flanterm terminal emulator. Useful for debugging real hardware.
|
||||
Set the pool size in pages for the First-Fit heap algorithm.
|
||||
endmenu
|
||||
|
||||
config CC
|
||||
menu "Toolchain"
|
||||
config CC
|
||||
string "C Compiler"
|
||||
default "gcc"
|
||||
help
|
||||
Path to the C compiler to use for building.
|
||||
endmenu
|
||||
|
||||
menu "Extras"
|
||||
config ENABLE_FLANTERM
|
||||
bool "Enable Flanterm Support"
|
||||
help
|
||||
Includes support for the Flanterm terminal emulator. Useful for debugging real hardware.
|
||||
endmenu
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#include <boot/emk.h>
|
||||
#include <util/align.h>
|
||||
#include <sys/kpanic.h>
|
||||
#include <util/log.h>
|
||||
|
||||
void *pool;
|
||||
block_t *freelist = NULL;
|
||||
|
@ -18,6 +19,7 @@ void heap_init()
|
|||
freelist = (block_t *)pool;
|
||||
freelist->size = (FF_POOL_SIZE * PAGE_SIZE) - sizeof(block_t);
|
||||
freelist->next = NULL;
|
||||
log_early("Initialized heap with a pool of %d pages (~%dMB)", FF_POOL_SIZE, DIV_ROUND_UP(FF_POOL_SIZE * PAGE_SIZE, 1024 * 1024));
|
||||
}
|
||||
|
||||
void *kmalloc(size_t size)
|
||||
|
@ -73,10 +75,35 @@ void kfree(void *ptr)
|
|||
if (!ptr)
|
||||
return;
|
||||
|
||||
/* get block header */
|
||||
block_t *block = (block_t *)((uint8_t *)ptr - sizeof(block_t));
|
||||
|
||||
/* insert freed block at head of freelist */
|
||||
block->next = freelist;
|
||||
freelist = block;
|
||||
/* insert block sorted by address in freelist */
|
||||
block_t **cur = &freelist;
|
||||
while (*cur && *cur < block)
|
||||
{
|
||||
cur = &(*cur)->next;
|
||||
}
|
||||
|
||||
block->next = *cur;
|
||||
*cur = block;
|
||||
|
||||
/* coalesce with next block if adjacent */
|
||||
if (block->next && (uint8_t *)block + sizeof(block_t) + block->size == (uint8_t *)block->next)
|
||||
{
|
||||
block->size += sizeof(block_t) + block->next->size;
|
||||
block->next = block->next->next;
|
||||
}
|
||||
|
||||
/* coalesce with previous block if adjacent */
|
||||
if (cur != &freelist)
|
||||
{
|
||||
block_t *prev = freelist;
|
||||
while (prev->next != block)
|
||||
prev = prev->next;
|
||||
if ((uint8_t *)prev + sizeof(block_t) + prev->size == (uint8_t *)block)
|
||||
{
|
||||
prev->size += sizeof(block_t) + block->size;
|
||||
prev->next = block->next;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -7,7 +7,9 @@
|
|||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#define FF_POOL_SIZE 512 // 2MB, in pages
|
||||
#ifndef FF_POOL_SIZE
|
||||
#define FF_POOL_SIZE 512
|
||||
#endif // FF_POOL_SIZE
|
||||
|
||||
typedef struct block
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue