diff options
-rwxr-xr-x | run | 3 | ||||
-rw-r--r-- | src/kernel/gdt/gdt.c | 4 | ||||
-rw-r--r-- | src/kernel/paging/paging.c | 1 | ||||
-rw-r--r-- | src/kernel/syscall/actions/sys_alloc.c | 7 | ||||
-rw-r--r-- | src/kernel/syscall/actions/sys_free.c | 8 | ||||
-rw-r--r-- | src/kernel/syscall/actions/sys_paging_alloc.c | 9 | ||||
-rw-r--r-- | src/kernel/syscall/actions/sys_paging_free.c | 8 | ||||
-rw-r--r-- | src/kernel/syscall/syscall.c | 4 | ||||
-rw-r--r-- | src/kernel/syscall/syscall.h | 4 | ||||
-rw-r--r-- | src/kernel/system.c | 2 | ||||
-rw-r--r-- | src/userspace/linker.ld | 21 | ||||
-rw-r--r-- | src/userspace/main.c | 6 | ||||
-rw-r--r-- | src/userspace/mlibc/stdio/printf.c | 6 | ||||
-rw-r--r-- | src/userspace/mlibc/stdio/readline.c | 2 | ||||
-rw-r--r-- | src/userspace/mlibc/stdlib/liballoc.c | 448 | ||||
-rw-r--r-- | src/userspace/mlibc/stdlib/liballoc.h | 12 | ||||
-rw-r--r-- | src/userspace/syscall.c | 4 | ||||
-rw-r--r-- | src/userspace/syscall.h | 4 |
18 files changed, 59 insertions, 494 deletions
@@ -105,8 +105,7 @@ make_build() { compile_with_flags -O3 -c ./"${line}" -I ./src/userspace -o ./build/userspace/"${stripped}" || exit done <./build/tmp rm ./build/tmp - compile_with_flags -O3 ./build/userspace/*.o -I ./src/userspace -o ./build/user.o || exit - i686-elf-objcopy -O binary ./build/user.o ./build/user.bin + compile_with_flags -O3 ./build/userspace/*.o -T ./src/userspace/linker.ld -I ./src/userspace -o ./build/user.bin || exit # Create ISO mkdir -p ./iso/boot/ diff --git a/src/kernel/gdt/gdt.c b/src/kernel/gdt/gdt.c index ea492b6..49d5ce6 100644 --- a/src/kernel/gdt/gdt.c +++ b/src/kernel/gdt/gdt.c @@ -104,7 +104,7 @@ void gdt_install() void tss_write(int32_t num, uint16_t ss0) { uint32_t base = (uint32_t) &tss_entry; - uint32_t limit = base + sizeof(struct tss_entry_struct); + uint32_t limit = base + sizeof(tss_entry); gdt_set_gate(num, base, limit, 0xE9, 0x00); @@ -119,5 +119,5 @@ void tss_write(int32_t num, uint16_t ss0) void tss_flush(void) { tss_entry.esp0 = 4096 + (uint32_t) kmalloc(4096); - asm volatile ("ltr %%ax": : "a" (0x2A)); + asm volatile ("ltr %%ax": : "a" (0x2B)); }
\ No newline at end of file diff --git a/src/kernel/paging/paging.c b/src/kernel/paging/paging.c index 33c57bd..e23c02c 100644 --- a/src/kernel/paging/paging.c +++ b/src/kernel/paging/paging.c @@ -146,6 +146,7 @@ uint32_t paging_alloc_pages(uint32_t count) { uint32_t ptr = paging_find_pages(count); paging_set_used(ptr, count); + paging_set_user(ptr, count); return ptr; } diff --git a/src/kernel/syscall/actions/sys_alloc.c b/src/kernel/syscall/actions/sys_alloc.c new file mode 100644 index 0000000..6579e0e --- /dev/null +++ b/src/kernel/syscall/actions/sys_alloc.c @@ -0,0 +1,7 @@ +#include <stdint.h> +#include <kernel/lib/stdlib/liballoc.h> + +uint32_t sys_alloc(uint32_t count) +{ + return (uint32_t) umalloc(count); +}
\ No newline at end of file diff --git a/src/kernel/syscall/actions/sys_free.c b/src/kernel/syscall/actions/sys_free.c new file mode 100644 index 0000000..6c3a82f --- /dev/null +++ b/src/kernel/syscall/actions/sys_free.c @@ -0,0 +1,8 @@ +#include <stdint.h> +#include <kernel/lib/stdlib/liballoc.h> + +uint32_t sys_free(uint32_t ptr) +{ + ufree((void *) ptr); + return 0; +}
\ No newline at end of file diff --git a/src/kernel/syscall/actions/sys_paging_alloc.c b/src/kernel/syscall/actions/sys_paging_alloc.c deleted file mode 100644 index 57ffd39..0000000 --- a/src/kernel/syscall/actions/sys_paging_alloc.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdint.h> -#include <kernel/paging/paging.h> - -uint32_t sys_paging_alloc(uint32_t count) -{ - uint32_t ptr = paging_alloc_pages((uint32_t) count); - paging_set_user(ptr, count); - return ptr; -}
\ No newline at end of file diff --git a/src/kernel/syscall/actions/sys_paging_free.c b/src/kernel/syscall/actions/sys_paging_free.c deleted file mode 100644 index cdf7bb1..0000000 --- a/src/kernel/syscall/actions/sys_paging_free.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdint.h> -#include <kernel/paging/paging.h> - -uint32_t sys_paging_free(uint32_t virt, uint32_t count) -{ - paging_set_free(virt, count); - return count; -}
\ No newline at end of file diff --git a/src/kernel/syscall/syscall.c b/src/kernel/syscall/syscall.c index 5f32c42..7ca7f99 100644 --- a/src/kernel/syscall/syscall.c +++ b/src/kernel/syscall/syscall.c @@ -13,8 +13,8 @@ uint32_t (*syscalls[])() = { [3] = (uint32_t (*)()) sys_writec, [4] = sys_readc, [5] = sys_get_pointers, - [6] = sys_paging_alloc, - [7] = sys_paging_free + [6] = sys_alloc, + [7] = sys_free }; void syscall_handler(struct regs *r) diff --git a/src/kernel/syscall/syscall.h b/src/kernel/syscall/syscall.h index ae69800..229cf04 100644 --- a/src/kernel/syscall/syscall.h +++ b/src/kernel/syscall/syscall.h @@ -15,8 +15,8 @@ uint32_t sys_readc(char *ch); uint32_t sys_get_pointers(); -uint32_t sys_paging_alloc(uint32_t count); +uint32_t sys_alloc(uint32_t count); -uint32_t sys_paging_free(uint32_t virt, uint32_t count); +uint32_t sys_free(uint32_t ptr); #endif
\ No newline at end of file diff --git a/src/kernel/system.c b/src/kernel/system.c index f7c7fc8..c37c890 100644 --- a/src/kernel/system.c +++ b/src/kernel/system.c @@ -18,7 +18,7 @@ void vga_clear() terminal_buffer[y * 80 + x] = 0 | (uint16_t) 0x700; } -static line = 0; +static int line = 0; void vga_log(char *msg) { diff --git a/src/userspace/linker.ld b/src/userspace/linker.ld new file mode 100644 index 0000000..720acdc --- /dev/null +++ b/src/userspace/linker.ld @@ -0,0 +1,21 @@ +OUTPUT_FORMAT("binary") + +SECTIONS +{ + . = 0; + + .text ALIGN(4): + { + *(.text) + } + + .data ALIGN(4): + { + *(.data) + } + + .rodata ALIGN(4): + { + *(.rodata*) + } +}
\ No newline at end of file diff --git a/src/userspace/main.c b/src/userspace/main.c index 62bdc4e..6149573 100644 --- a/src/userspace/main.c +++ b/src/userspace/main.c @@ -14,14 +14,10 @@ void user_main() char text[] = "> Successfully switched to usermode!\n"; printf(text); - // init_framebuffer(); - // writec((char) strlen("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); - while (1) { char *input = readline(); if (starts_with(input, "ls")) { - char test[] = "WOOOHOOO\n"; - syscall_write(test); + printf(text); } }; }
\ No newline at end of file diff --git a/src/userspace/mlibc/stdio/printf.c b/src/userspace/mlibc/stdio/printf.c index 5617d03..b582897 100644 --- a/src/userspace/mlibc/stdio/printf.c +++ b/src/userspace/mlibc/stdio/printf.c @@ -1,10 +1,14 @@ #include <stdarg.h> #include <mlibc/stdio.h> +#include <mlibc/string.h> +#include <mlibc/stdlib.h> void printf(const char *fmt, ...) { + char *format = (char *) malloc(strlen(fmt)); + strcpy(format, fmt); va_list args; va_start(args, fmt); - vprintf(fmt, args); + vprintf(format, args); va_end(args); }
\ No newline at end of file diff --git a/src/userspace/mlibc/stdio/readline.c b/src/userspace/mlibc/stdio/readline.c index 8937702..68e8499 100644 --- a/src/userspace/mlibc/stdio/readline.c +++ b/src/userspace/mlibc/stdio/readline.c @@ -3,7 +3,7 @@ char *readline() { - char ret[256] = {'\0'}; + char *ret = malloc(256); char buf = 0; while (buf != '\n') { buf = getch(); diff --git a/src/userspace/mlibc/stdlib/liballoc.c b/src/userspace/mlibc/stdlib/liballoc.c index ceb87f6..2a10c0d 100644 --- a/src/userspace/mlibc/stdlib/liballoc.c +++ b/src/userspace/mlibc/stdlib/liballoc.c @@ -1,454 +1,12 @@ #include <stddef.h> -#include <stdint.h> #include <syscall.h> -int liballoc_lock() +void *malloc(size_t count) { - return 0; -} - -int liballoc_unlock() -{ - return 0; -} - -void *liballoc_alloc(size_t p) -{ - uint32_t ptr = syscall_paging_alloc((uint32_t) p); - return (void *) ptr; -} - -int liballoc_free(void *ptr, size_t p) -{ - syscall_paging_free((uint32_t) ptr, (uint32_t) p); - return 0; -} - -#define ALIGNMENT 16ul -#define ALIGN_TYPE char -#define ALIGN_INFO sizeof(ALIGN_TYPE) * 16 -#define USE_CASE1 -#define USE_CASE2 -#define USE_CASE3 -#define USE_CASE4 -#define USE_CASE5 - -#define ALIGN(ptr) \ - if ( ALIGNMENT > 1 ) { \ - uintptr_t diff; \ - ptr = (void*) ((uintptr_t) ptr + ALIGN_INFO); \ - diff = (uintptr_t) ptr & (ALIGNMENT - 1); \ - if (diff != 0) { \ - diff = ALIGNMENT - diff; \ - ptr = (void*) ((uintptr_t) ptr + diff); \ - } \ - *((ALIGN_TYPE*) ((uintptr_t) ptr - ALIGN_INFO)) = diff + ALIGN_INFO; \ - } - -#define UNALIGN(ptr) \ - if (ALIGNMENT > 1) { \ - uintptr_t diff = *((ALIGN_TYPE*) ((uintptr_t) ptr - ALIGN_INFO)); \ - if (diff < (ALIGNMENT + ALIGN_INFO)) { \ - ptr = (void*) ((uintptr_t) ptr - diff); \ - } \ - } - -#define LIBALLOC_MAGIC 0x900df00d -#define LIBALLOC_DEAD 0xbaadf00d - -struct liballoc_major { - struct liballoc_major *prev; - struct liballoc_major *next; - unsigned int pages; - unsigned int size; - unsigned int usage; - struct liballoc_minor *first; -}; - -struct liballoc_minor { - struct liballoc_minor *prev; - struct liballoc_minor *next; - struct liballoc_major *block; - unsigned int magic; - unsigned int size; - unsigned int req_size; -}; - -static struct liballoc_major *l_memRoot = NULL; -static struct liballoc_major *l_bestBet = NULL; - -static unsigned int l_pageSize = 4096; -static unsigned int l_pageCount = 16; -static unsigned long long l_allocated = 0; -static unsigned long long l_inuse = 0; - -static long long l_warningCount = 0; -static long long l_errorCount = 0; -static long long l_possibleOverruns = 0; - -static void *liballoc_memset(void *s, int c, size_t n) -{ - unsigned int i; - for (i = 0; i < n; i++) - ((char *) s)[i] = c; - - return s; -} - -static void *liballoc_memcpy(void *s1, const void *s2, size_t n) -{ - char *cdest; - char *csrc; - unsigned int *ldest = (unsigned int *) s1; - unsigned int *lsrc = (unsigned int *) s2; - - while (n >= sizeof(unsigned int)) { - *ldest++ = *lsrc++; - n -= sizeof(unsigned int); - } - - cdest = (char *) ldest; - csrc = (char *) lsrc; - - while (n > 0) { - *cdest++ = *csrc++; - n -= 1; - } - return s1; -} - -static struct liballoc_major *allocate_new_page(unsigned int size) -{ - unsigned int st; - struct liballoc_major *maj; - - st = size + sizeof(struct liballoc_major); - st += sizeof(struct liballoc_minor); - - if ((st % l_pageSize) == 0) - st = st / (l_pageSize); - else - st = st / (l_pageSize) + 1; - - if (st < l_pageCount) st = l_pageCount; - - maj = (struct liballoc_major *) liballoc_alloc(st); - - if (maj == NULL) { - l_warningCount += 1; - return NULL; - } - - maj->prev = NULL; - maj->next = NULL; - maj->pages = st; - maj->size = st * l_pageSize; - maj->usage = sizeof(struct liballoc_major); - maj->first = NULL; - - l_allocated += maj->size; - - return maj; -} - -void *malloc(size_t req_size) -{ - int startedBet = 0; - unsigned long long bestSize = 0; - void *p = NULL; - uintptr_t diff; - struct liballoc_major *maj; - struct liballoc_minor *min; - struct liballoc_minor *new_min; - unsigned long size = req_size; - - if (ALIGNMENT > 1) { - size += ALIGNMENT + ALIGN_INFO; - } - - liballoc_lock(); - - if (size == 0) { - l_warningCount += 1; - liballoc_unlock(); - // return malloc(1); - } - - if (l_memRoot == NULL) { - l_memRoot = allocate_new_page(size); - if (l_memRoot == NULL) { - liballoc_unlock(); - return NULL; - } - } - - maj = l_memRoot; - startedBet = 0; - - if (l_bestBet != NULL) { - bestSize = l_bestBet->size - l_bestBet->usage; - - if (bestSize > (size + sizeof(struct liballoc_minor))) { - maj = l_bestBet; - startedBet = 1; - } - } - - while (maj != NULL) { - diff = maj->size - maj->usage; - if (bestSize < diff) { - l_bestBet = maj; - bestSize = diff; - } - -#ifdef USE_CASE1 - if (diff < (size + sizeof(struct liballoc_minor))) { - if (maj->next != NULL) { - maj = maj->next; - continue; - } - - if (startedBet == 1) { - maj = l_memRoot; - startedBet = 0; - continue; - } - - maj->next = allocate_new_page(size); - if (maj->next == NULL) break; - maj->next->prev = maj; - maj = maj->next; - } -#endif - -#ifdef USE_CASE2 - if (maj->first == NULL) { - maj->first = (struct liballoc_minor *) ((uintptr_t) maj + sizeof(struct liballoc_major)); - - maj->first->magic = LIBALLOC_MAGIC; - maj->first->prev = NULL; - maj->first->next = NULL; - maj->first->block = maj; - maj->first->size = size; - maj->first->req_size = req_size; - maj->usage += size + sizeof(struct liballoc_minor); - l_inuse += size; - p = (void *) ((uintptr_t) (maj->first) + sizeof(struct liballoc_minor)); - ALIGN(p); - liballoc_unlock(); - return p; - } -#endif - -#ifdef USE_CASE3 - diff = (uintptr_t) (maj->first); - diff -= (uintptr_t) maj; - diff -= sizeof(struct liballoc_major); - - if (diff >= (size + sizeof(struct liballoc_minor))) { - maj->first->prev = (struct liballoc_minor *) ((uintptr_t) maj + sizeof(struct liballoc_major)); - maj->first->prev->next = maj->first; - maj->first = maj->first->prev; - maj->first->magic = LIBALLOC_MAGIC; - maj->first->prev = NULL; - maj->first->block = maj; - maj->first->size = size; - maj->first->req_size = req_size; - maj->usage += size + sizeof(struct liballoc_minor); - l_inuse += size; - p = (void *) ((uintptr_t) (maj->first) + sizeof(struct liballoc_minor)); - ALIGN(p); - liballoc_unlock(); - return p; - } -#endif - -#ifdef USE_CASE4 - min = maj->first; - - while (min != NULL) { - if (min->next == NULL) { - diff = (uintptr_t) (maj) + maj->size; - diff -= (uintptr_t) min; - diff -= sizeof(struct liballoc_minor); - diff -= min->size; - if (diff >= (size + sizeof(struct liballoc_minor))) { - min->next = (struct liballoc_minor *) ((uintptr_t) min + sizeof(struct liballoc_minor) + min->size); - min->next->prev = min; - min = min->next; - min->next = NULL; - min->magic = LIBALLOC_MAGIC; - min->block = maj; - min->size = size; - min->req_size = req_size; - maj->usage += size + sizeof(struct liballoc_minor); - l_inuse += size; - p = (void *) ((uintptr_t) min + sizeof(struct liballoc_minor)); - ALIGN(p); - liballoc_unlock(); - return p; - } - } - - if (min->next != NULL) { - diff = (uintptr_t) (min->next); - diff -= (uintptr_t) min; - diff -= sizeof(struct liballoc_minor); - diff -= min->size; - - if (diff >= (size + sizeof(struct liballoc_minor))) { - new_min = (struct liballoc_minor *) ((uintptr_t) min + sizeof(struct liballoc_minor) + min->size); - new_min->magic = LIBALLOC_MAGIC; - new_min->next = min->next; - new_min->prev = min; - new_min->size = size; - new_min->req_size = req_size; - new_min->block = maj; - min->next->prev = new_min; - min->next = new_min; - maj->usage += size + sizeof(struct liballoc_minor); - l_inuse += size; - p = (void *) ((uintptr_t) new_min + sizeof(struct liballoc_minor)); - ALIGN(p); - liballoc_unlock(); - return p; - } - } - - min = min->next; - } -#endif - -#ifdef USE_CASE5 - if (maj->next == NULL) { - if (startedBet == 1) { - maj = l_memRoot; - startedBet = 0; - continue; - } - maj->next = allocate_new_page(size); - if (maj->next == NULL) break; - maj->next->prev = maj; - } -#endif - maj = maj->next; - } - - liballoc_unlock(); - - return NULL; + return (void *) syscall_alloc(count); } void free(void *ptr) { - struct liballoc_minor *min; - struct liballoc_major *maj; - - if (ptr == NULL) { - l_warningCount += 1; - return; - } - - UNALIGN(ptr); - liballoc_lock(); - - min = (struct liballoc_minor *) ((uintptr_t) ptr - sizeof(struct liballoc_minor)); - - if (min->magic != LIBALLOC_MAGIC) { - l_errorCount += 1; - - if (((min->magic & 0xFFFFFF) == (LIBALLOC_MAGIC & 0xFFFFFF)) || - ((min->magic & 0xFFFF) == (LIBALLOC_MAGIC & 0xFFFF)) || - ((min->magic & 0xFF) == (LIBALLOC_MAGIC & 0xFF))) { - l_possibleOverruns += 1; - } - - liballoc_unlock(); - return; - } - - maj = min->block; - l_inuse -= min->size; - maj->usage -= (min->size + sizeof(struct liballoc_minor)); - min->magic = LIBALLOC_DEAD; - - if (min->next != NULL) min->next->prev = min->prev; - if (min->prev != NULL) min->prev->next = min->next; - if (min->prev == NULL) maj->first = min->next; - if (maj->first == NULL) { - if (l_memRoot == maj) l_memRoot = maj->next; - if (l_bestBet == maj) l_bestBet = NULL; - if (maj->prev != NULL) maj->prev->next = maj->next; - if (maj->next != NULL) maj->next->prev = maj->prev; - l_allocated -= maj->size; - liballoc_free(maj, maj->pages); - } else { - if (l_bestBet != NULL) { - int bestSize = l_bestBet->size - l_bestBet->usage; - int majSize = maj->size - maj->usage; - if (majSize > bestSize) l_bestBet = maj; - } - } - liballoc_unlock(); -} - -void *calloc(size_t nobj, size_t size) -{ - int real_size; - void *p; - - real_size = nobj * size; - - p = malloc(real_size); - - liballoc_memset(p, 0, real_size); - - return p; -} - -void *realloc(void *p, size_t size) -{ - void *ptr; - struct liballoc_minor *min; - unsigned int real_size; - - if (size == 0) { - free(p); - return NULL; - } - - if (p == NULL) return malloc(size); - - ptr = p; - UNALIGN(ptr); - liballoc_lock(); - min = (struct liballoc_minor *) ((uintptr_t) ptr - sizeof(struct liballoc_minor)); - - if (min->magic != LIBALLOC_MAGIC) { - l_errorCount += 1; - if (((min->magic & 0xFFFFFF) == (LIBALLOC_MAGIC & 0xFFFFFF)) || - ((min->magic & 0xFFFF) == (LIBALLOC_MAGIC & 0xFFFF)) || - ((min->magic & 0xFF) == (LIBALLOC_MAGIC & 0xFF))) { - l_possibleOverruns += 1; - } - - liballoc_unlock(); - return NULL; - } - - real_size = min->req_size; - - if (real_size >= size) { - min->req_size = size; - liballoc_unlock(); - return p; - } - - liballoc_unlock(); - - ptr = malloc(size); - liballoc_memcpy(ptr, p, real_size); - free(p); - - return ptr; + syscall_free((uint32_t) ptr); } diff --git a/src/userspace/mlibc/stdlib/liballoc.h b/src/userspace/mlibc/stdlib/liballoc.h index d21aeb4..d9d08ee 100644 --- a/src/userspace/mlibc/stdlib/liballoc.h +++ b/src/userspace/mlibc/stdlib/liballoc.h @@ -3,20 +3,8 @@ #include <stddef.h> -int liballoc_lock(); - -int liballoc_unlock(); - -void *liballoc_alloc(size_t); - -int liballoc_free(void *, size_t); - void *malloc(size_t); -void *realloc(void *, size_t); - -void *calloc(size_t, size_t); - void free(void *); #endif diff --git a/src/userspace/syscall.c b/src/userspace/syscall.c index 35e6d50..132cd49 100644 --- a/src/userspace/syscall.c +++ b/src/userspace/syscall.c @@ -15,6 +15,6 @@ DEFN_SYSCALL0(readc, 4); DEFN_SYSCALL0(get_pointers, 5); -DEFN_SYSCALL1(paging_alloc, 6, uint32_t); +DEFN_SYSCALL1(alloc, 6, uint32_t); -DEFN_SYSCALL2(paging_free, 7, uint32_t, uint32_t);
\ No newline at end of file +DEFN_SYSCALL1(free, 7, uint32_t);
\ No newline at end of file diff --git a/src/userspace/syscall.h b/src/userspace/syscall.h index 60fb288..e46f453 100644 --- a/src/userspace/syscall.h +++ b/src/userspace/syscall.h @@ -76,8 +76,8 @@ DECL_SYSCALL0(readc); DECL_SYSCALL0(get_pointers); -DECL_SYSCALL1(paging_alloc, uint32_t); +DECL_SYSCALL1(alloc, uint32_t); -DECL_SYSCALL2(paging_free, uint32_t, uint32_t); +DECL_SYSCALL1(free, uint32_t); #endif |