mirror of
https://github.com/subhobhai943/SUB-OS.git
synced 2026-10-25 16:52:29 +00:00
feat: Add SLAB allocator, Ramdisk, Kernel Namespaces, Event Tracing, NetFilter Firewall, 8-Bit Melodies, and Shell Scripting (sh)
This commit is contained in:
1 parent
9f9a19bab0
commit
2f1f785cee
17 files changed
+1021
-115
No files matched your search
@@ -0,0 +1,92 @@
|
||||
#include <mm/slab.h>
|
||||
#include <mm/kmalloc.h>
|
||||
#include <lib/string.h>
|
||||
#include <kernel/printk.h>
|
||||
|
||||
static kmem_cache_t cache_table[SLAB_MAX_CACHES];
|
||||
static size_t cache_count = 0;
|
||||
|
||||
void slab_init(void) {
|
||||
memset(cache_table, 0, sizeof(cache_table));
|
||||
cache_count = 0;
|
||||
|
||||
// Initialize core kernel slabs
|
||||
kmem_cache_create("task_struct", 512, 16, NULL, NULL);
|
||||
kmem_cache_create("vfs_node", 256, 8, NULL, NULL);
|
||||
kmem_cache_create("file_desc", 64, 8, NULL, NULL);
|
||||
kmem_cache_create("socket_cache", 128, 8, NULL, NULL);
|
||||
kmem_cache_create("buffer_head", 64, 8, NULL, NULL);
|
||||
|
||||
printk(KERN_INFO "SLAB: High-performance SLUB/SLAB Object Cache layer initialized\n");
|
||||
}
|
||||
|
||||
kmem_cache_t* kmem_cache_create(const char* name, size_t size, size_t align, kmem_ctor_fn_t ctor, kmem_dtor_fn_t dtor) {
|
||||
if (!name || size == 0) return NULL;
|
||||
|
||||
for (size_t i = 0; i < SLAB_MAX_CACHES; i++) {
|
||||
if (!cache_table[i].in_use) {
|
||||
kmem_cache_t* c = &cache_table[i];
|
||||
c->in_use = true;
|
||||
strncpy(c->name, name, SLAB_NAME_MAX - 1);
|
||||
c->name[SLAB_NAME_MAX - 1] = '\0';
|
||||
|
||||
if (align < 8) align = 8;
|
||||
c->alignment = align;
|
||||
c->object_size = (size + align - 1) & ~(align - 1);
|
||||
c->objects_per_slab = 4096 / c->object_size;
|
||||
if (c->objects_per_slab == 0) c->objects_per_slab = 1;
|
||||
|
||||
c->active_objects = 0;
|
||||
c->total_slabs = 0;
|
||||
c->ctor = ctor;
|
||||
c->dtor = dtor;
|
||||
c->slabs_partial = NULL;
|
||||
c->slabs_full = NULL;
|
||||
c->slabs_empty = NULL;
|
||||
|
||||
if (i >= cache_count) cache_count = i + 1;
|
||||
return c;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void* kmem_cache_alloc(kmem_cache_t* cache) {
|
||||
if (!cache || !cache->in_use) return NULL;
|
||||
|
||||
void* obj = kmalloc(cache->object_size);
|
||||
if (obj) {
|
||||
cache->active_objects++;
|
||||
if (cache->ctor) {
|
||||
cache->ctor(obj);
|
||||
}
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
void kmem_cache_free(kmem_cache_t* cache, void* obj) {
|
||||
if (!cache || !obj || !cache->in_use) return;
|
||||
|
||||
if (cache->dtor) {
|
||||
cache->dtor(obj);
|
||||
}
|
||||
if (cache->active_objects > 0) {
|
||||
cache->active_objects--;
|
||||
}
|
||||
kfree(obj);
|
||||
}
|
||||
|
||||
int kmem_cache_destroy(kmem_cache_t* cache) {
|
||||
if (!cache || !cache->in_use) return -1;
|
||||
cache->in_use = false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
size_t slab_get_cache_count(void) {
|
||||
return cache_count;
|
||||
}
|
||||
|
||||
const kmem_cache_t* slab_get_cache(size_t index) {
|
||||
if (index >= SLAB_MAX_CACHES || !cache_table[index].in_use) return NULL;
|
||||
return &cache_table[index];
|
||||
}
|
||||
Reference in new issue
Block a user