Sun 12 Jan 19:29:58 CET 2025

This commit is contained in:
sbosse 2025-01-12 19:30:24 +01:00
parent 126b85a034
commit e6199ac2c5

View File

@ -14,14 +14,7 @@ See the file LICENSE for details.
#define KMALLOC_STATE_FREE 0xa1a1a1a1 #define KMALLOC_STATE_FREE 0xa1a1a1a1
#define KMALLOC_STATE_USED 0xbfbfbfbf #define KMALLOC_STATE_USED 0xbfbfbfbf
struct kmalloc_chunk { static struct kmalloc_chunk *kmalloc_head = 0;
int state;
int length;
struct kmalloc_chunk *next;
struct kmalloc_chunk *prev;
};
static struct kmalloc_chunk *head = 0;
/* /*
Initialize the linked list by creating a single chunk at Initialize the linked list by creating a single chunk at
@ -31,11 +24,11 @@ free and has no next or previous chunks.
void kmalloc_init(char *start, int length) void kmalloc_init(char *start, int length)
{ {
head = (struct kmalloc_chunk *) start; kmalloc_head = (struct kmalloc_chunk *) start;
head->state = KMALLOC_STATE_FREE; kmalloc_head->state = KMALLOC_STATE_FREE;
head->length = length; kmalloc_head->length = length;
head->next = 0; kmalloc_head->next = 0;
head->prev = 0; kmalloc_head->prev = 0;
} }
/* /*
@ -76,7 +69,7 @@ void *kmalloc(int length)
// then add one more unit to accommodate the chunk header // then add one more unit to accommodate the chunk header
length += KUNIT; length += KUNIT;
struct kmalloc_chunk *c = head; struct kmalloc_chunk *c = kmalloc_head;
while(1) { while(1) {
if(!c) { if(!c) {
@ -149,7 +142,7 @@ void kmalloc_debug()
printf("state ptr prev next length\n"); printf("state ptr prev next length\n");
for(c = head; c; c = c->next) { for(c = kmalloc_head; c; c = c->next) {
if(c->state == KMALLOC_STATE_FREE) { if(c->state == KMALLOC_STATE_FREE) {
printf("F"); printf("F");
} else if(c->state == KMALLOC_STATE_USED) { } else if(c->state == KMALLOC_STATE_USED) {
@ -177,13 +170,13 @@ static int kmalloc_test_single_alloc(void)
{ {
char *ptr = kmalloc(128); char *ptr = kmalloc(128);
struct kmalloc_chunk *next = 0; struct kmalloc_chunk *next = 0;
int res = (unsigned long) ptr == (unsigned long) head + sizeof(struct kmalloc_chunk); int res = (unsigned long) ptr == (unsigned long) kmalloc_head + sizeof(struct kmalloc_chunk);
res &= head->state == KMALLOC_STATE_USED; res &= kmalloc_head->state == KMALLOC_STATE_USED;
res &= head->length == 128 + sizeof(struct kmalloc_chunk); res &= kmalloc_head->length == 128 + sizeof(struct kmalloc_chunk);
res &= (char *) head->next == (char *) KMALLOC_START + head->length; res &= (char *) kmalloc_head->next == (char *) KMALLOC_START + kmalloc_head->length;
next = head->next; next = kmalloc_head->next;
res &= next->state == KMALLOC_STATE_FREE; res &= next->state == KMALLOC_STATE_FREE;
res &= next->length == KMALLOC_LENGTH - head->length; res &= next->length == KMALLOC_LENGTH - kmalloc_head->length;
return res; return res;
} }
@ -193,9 +186,9 @@ static int kmalloc_test_single_alloc_and_free(void)
char *ptr = kmalloc(128); char *ptr = kmalloc(128);
int res; int res;
kfree(ptr); kfree(ptr);
res = head->state == KMALLOC_STATE_FREE; res = kmalloc_head->state == KMALLOC_STATE_FREE;
res &= head->next == 0; res &= kmalloc_head->next == 0;
res &= head->length == KMALLOC_LENGTH; res &= kmalloc_head->length == KMALLOC_LENGTH;
return res; return res;
} }
@ -223,3 +216,7 @@ int kmalloc_test(void)
} }
return 1; return 1;
} }
#ifdef KMALLOC_EXT
#include "kmalloc_ext.c"
#endif