forked from PoliEcho-holding-org/kern
Compare commits
2
Commits
eba8b5ad4f
...
675ff8519a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
675ff8519a | ||
|
|
8ab7e5a33d |
+34
-33
@@ -17,47 +17,48 @@ 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;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
#ifndef _LIMIT_H
|
||||||
|
#define _LIMIT_H
|
||||||
|
#define CHAR_BIT 8
|
||||||
|
|
||||||
|
#endif
|
||||||
+29
-2
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user