Compare commits

...
2 Commits
Author SHA1 Message Date
PoliEcho 675ff8519a void********************* 2026-09-24 17:34:14 +02:00
PoliEcho 8ab7e5a33d add limit6 2026-09-24 12:21:54 +02:00
3 changed files with 68 additions and 35 deletions
+33 -32
View File
@@ -17,46 +17,47 @@ void* kcalloc(size_t count, size_t size);
// powers of 2 // powers of 2
#define KMALLOC_MAX_SIZE 17 #define KMALLOC_MAX_SIZE 17
#define LOWEST_POWER 3
union per_cpu_freelist_cache { union per_cpu_freelist_cache {
void* freelists[KMALLOC_MAX_SIZE]; void** freelists[KMALLOC_MAX_SIZE];
struct { struct {
void* kmalloc_8; void** kmalloc_8;
void* kmalloc_16; void** kmalloc_16;
void* kmalloc_32; void** kmalloc_32;
void* kmalloc_64; void** kmalloc_64;
void* kmalloc_128; void** kmalloc_128;
void* kmalloc_256; void** kmalloc_256;
void* kmalloc_512; void** kmalloc_512;
void* kmalloc_1024; void** kmalloc_1024;
void* kmalloc_2048; void** kmalloc_2048;
void* kmalloc_4096; void** kmalloc_4096;
void* kmalloc_8192; void** kmalloc_8192;
void* kmalloc_16384; void** kmalloc_16384;
void* kmalloc_32768; void** kmalloc_32768;
void* kmalloc_65536; void** kmalloc_65536;
void* kmalloc_131072; void** kmalloc_131072;
}; };
}; };
union partial_list { union partial_list {
void* freelists[KMALLOC_MAX_SIZE]; void** freelists[KMALLOC_MAX_SIZE];
struct { struct {
void* kmalloc_8; void** kmalloc_8;
void* kmalloc_16; void** kmalloc_16;
void* kmalloc_32; void** kmalloc_32;
void* kmalloc_64; void** kmalloc_64;
void* kmalloc_128; void** kmalloc_128;
void* kmalloc_256; void** kmalloc_256;
void* kmalloc_512; void** kmalloc_512;
void* kmalloc_1024; void** kmalloc_1024;
void* kmalloc_2048; void** kmalloc_2048;
void* kmalloc_4096; void** kmalloc_4096;
void* kmalloc_8192; void** kmalloc_8192;
void* kmalloc_16384; void** kmalloc_16384;
void* kmalloc_32768; void** kmalloc_32768;
void* kmalloc_65536; void** kmalloc_65536;
void* kmalloc_131072; void** kmalloc_131072;
}; };
}; };
+5
View File
@@ -0,0 +1,5 @@
#ifndef _LIMIT_H
#define _LIMIT_H
#define CHAR_BIT 8
#endif
+29 -2
View File
@@ -1,5 +1,7 @@
#include "kernel.h"
#include "types.h" #include "types.h"
#include <kmalloc.h> #include <kmalloc.h>
#include <limits.h>
#include <string.h> #include <string.h>
// this file contains SLUB inspired HEAP allocator // this file contains SLUB inspired HEAP allocator
@@ -46,7 +48,32 @@ void* kmalloc(size_t size) {
: "eax", "edx"); : "eax", "edx");
// freelists_all_cpus[core_id]; // freelists_all_cpus[core_id];
// TODO enable when we actualy know how many CPUs we have // TODO disable when we actualy know how many CPUs we have
if () { core_id = 0;
size_t alloc_index;
{
uint8_t leading_zeros = __builtin_clzll(size);
if (__builtin_popcountll(size) == 1) {
alloc_index = leading_zeros;
} else {
alloc_index = sizeof(size) * CHAR_BIT - leading_zeros;
}
if (alloc_index > KMALLOC_MAX_SIZE) {
// NOT IMPLEMENTED
printk("Cannot allocate [%lu] bytes: \e[1MNOT "
"IMPLEMENTED!\e[8M\n",
size);
return NULL;
}
alloc_index -= LOWEST_POWER;
}
void** selected_freelist =
freelists_all_cpus[core_id].freelists[alloc_index];
if (selected_freelist != NULL) {
// fast path
void** second_item_in_list = *selected_freelist;
} else {
// slower path
} }
} }