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
+34 -33
View File
@@ -17,47 +17,48 @@ void* kcalloc(size_t count, size_t size);
// powers of 2
#define KMALLOC_MAX_SIZE 17
#define LOWEST_POWER 3
union per_cpu_freelist_cache {
void* freelists[KMALLOC_MAX_SIZE];
void** freelists[KMALLOC_MAX_SIZE];
struct {
void* kmalloc_8;
void* kmalloc_16;
void* kmalloc_32;
void* kmalloc_64;
void* kmalloc_128;
void* kmalloc_256;
void* kmalloc_512;
void* kmalloc_1024;
void* kmalloc_2048;
void* kmalloc_4096;
void* kmalloc_8192;
void* kmalloc_16384;
void* kmalloc_32768;
void* kmalloc_65536;
void* kmalloc_131072;
void** kmalloc_8;
void** kmalloc_16;
void** kmalloc_32;
void** kmalloc_64;
void** kmalloc_128;
void** kmalloc_256;
void** kmalloc_512;
void** kmalloc_1024;
void** kmalloc_2048;
void** kmalloc_4096;
void** kmalloc_8192;
void** kmalloc_16384;
void** kmalloc_32768;
void** kmalloc_65536;
void** kmalloc_131072;
};
};
union partial_list {
void* freelists[KMALLOC_MAX_SIZE];
void** freelists[KMALLOC_MAX_SIZE];
struct {
void* kmalloc_8;
void* kmalloc_16;
void* kmalloc_32;
void* kmalloc_64;
void* kmalloc_128;
void* kmalloc_256;
void* kmalloc_512;
void* kmalloc_1024;
void* kmalloc_2048;
void* kmalloc_4096;
void* kmalloc_8192;
void* kmalloc_16384;
void* kmalloc_32768;
void* kmalloc_65536;
void* kmalloc_131072;
void** kmalloc_8;
void** kmalloc_16;
void** kmalloc_32;
void** kmalloc_64;
void** kmalloc_128;
void** kmalloc_256;
void** kmalloc_512;
void** kmalloc_1024;
void** kmalloc_2048;
void** kmalloc_4096;
void** kmalloc_8192;
void** kmalloc_16384;
void** kmalloc_32768;
void** kmalloc_65536;
void** kmalloc_131072;
};
};
#endif
#endif
+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 <kmalloc.h>
#include <limits.h>
#include <string.h>
// this file contains SLUB inspired HEAP allocator
@@ -46,7 +48,32 @@ void* kmalloc(size_t size) {
: "eax", "edx");
// freelists_all_cpus[core_id];
// TODO enable when we actualy know how many CPUs we have
if () {
// TODO disable when we actualy know how many CPUs we have
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
}
}