From 3e11999e62fd860ba5a5419b9fd9a83ccc4ebf0a Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Thu, 22 Aug 2024 03:13:17 +0300 Subject: [PATCH] random number generator, malloc stats --- kern/src/libc/malloc.c | 20 +++++++++++++++++++- kern/src/libc/malloc.h | 3 +++ kern/src/libc/rand.c | 16 ++++++++++++++++ kern/src/libc/stdlib.h | 5 +++++ kern/src/main.c | 34 ++++++++++++++++++++++++++-------- 5 files changed, 69 insertions(+), 9 deletions(-) create mode 100644 kern/src/libc/rand.c diff --git a/kern/src/libc/malloc.c b/kern/src/libc/malloc.c index d96f7ec..223ba13 100644 --- a/kern/src/libc/malloc.c +++ b/kern/src/libc/malloc.c @@ -17,7 +17,8 @@ struct memrange { #define RNGEND(rng) ((struct memrange __far*)((char __far*)(rng) + (rng)->len)) static struct memrange __far *pool; -static unsigned int freemem, num_alloc; +static unsigned long freemem; +static unsigned int num_alloc; int kmalloc_init(int numblk) @@ -161,3 +162,20 @@ void kfree(void __far *p) } } } + +void dbg_print_kmalloc_pool(void) +{ + struct memrange __far *m; + + m = pool; + while(m) { + printf("[%x:%x/%x] ", FP_SEG(m), FP_OFFS(m), m->len); + m = m->next; + } + putchar('\n'); +} + +void dbg_print_kmalloc_stats(void) +{ + printf("free memory: %lx, num alloc: %x\n", freemem, num_alloc); +} diff --git a/kern/src/libc/malloc.h b/kern/src/libc/malloc.h index d17a209..facc7a9 100644 --- a/kern/src/libc/malloc.h +++ b/kern/src/libc/malloc.h @@ -5,4 +5,7 @@ int kmalloc_init(int numblk); void __far *kmalloc(unsigned long sz); void kfree(void __far *ptr); +void dbg_print_kmalloc_pool(void); +void dbg_print_kmalloc_stats(void); + #endif /* MALLOC_H_ */ diff --git a/kern/src/libc/rand.c b/kern/src/libc/rand.c new file mode 100644 index 0000000..5eb8103 --- /dev/null +++ b/kern/src/libc/rand.c @@ -0,0 +1,16 @@ +#include +#include + +unsigned long st = 1; + +int rand(void) +{ + st = st * 1103515245 + 12345; + return (unsigned int)(st >> 16) & 0xffff; +} + +void srand(unsigned int seed) +{ + st = seed; +} + diff --git a/kern/src/libc/stdlib.h b/kern/src/libc/stdlib.h index f8ff71b..ec17319 100644 --- a/kern/src/libc/stdlib.h +++ b/kern/src/libc/stdlib.h @@ -1,10 +1,15 @@ #ifndef STDLIB_H_ #define STDLIB_H_ +#define RAND_MAX 32767 + #define abs(x) __builtin_abs(x) int atoi(const char *str); long atol(const char *str); long strtol(const char *str, char **endp, int base); +int rand(void); +void srand(unsigned int seed); + #endif /* STDLIB_H_ */ diff --git a/kern/src/main.c b/kern/src/main.c index 178e328..6a412d4 100644 --- a/kern/src/main.c +++ b/kern/src/main.c @@ -1,6 +1,7 @@ #include "config.h" #include +#include #include #include "intr.h" #include "vid.h" @@ -11,6 +12,8 @@ void kmain(void) { + int i; + vid_init(); ser_init(); con_init(); @@ -18,14 +21,29 @@ void kmain(void) printf("eightysix kernel %s\n", VERSTR); - void __far *ptr = kmalloc(2000); - printf("allocated 2k at: %x:%x\n", FP_SEG(ptr), FP_OFFS(ptr)); - kfree(ptr); - printf("freed\n"); - ptr = kmalloc(256); - printf("allocated 256b, got: %x:%x\n", FP_SEG(ptr), FP_OFFS(ptr)); - ptr = kmalloc(512); - printf("allocated 512 more at: %x:%x\n", FP_SEG(ptr), FP_OFFS(ptr)); + printf("kmalloc free pool\n"); + dbg_print_kmalloc_pool(); + printf("kmalloc stats\n"); + dbg_print_kmalloc_stats(); + + void __far *ptr[32]; + + for(i=0; i<32; i++) { + ptr[i] = kmalloc(256); + } + + for(i=0; i<20; i++) { + int idx = rand() & 0x1f; + if(ptr[idx]) { + kfree(ptr[idx]); + ptr[idx] = 0; + } + } + + printf("kmalloc free pool\n"); + dbg_print_kmalloc_pool(); + printf("kmalloc stats\n"); + dbg_print_kmalloc_stats(); init_intr(); } -- 1.7.10.4