Sun 12 Jan 19:29:58 CET 2025
This commit is contained in:
		
							parent
							
								
									126b85a034
								
							
						
					
					
						commit
						e6199ac2c5
					
				|  | @ -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 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user