# HG changeset patch # User windel # Date 1325075923 -3600 # Node ID 47b7df514243944ddf5cabb29cd506d35ef3accc # Parent 7f74363f4c8214286f8288a4cadaa4c8069a64ed Moved Makefiles diff -r 7f74363f4c82 -r 47b7df514243 cos/Makefile --- a/cos/Makefile Tue Dec 27 18:59:02 2011 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -# vim: set noexpandtab: - -all: bootdisk.img Makefile - -bootdisk.img: lcfosc.bin grub/menu.lst Makefile - cp grub/emptybootdisk.img bootdisk.img - mcopy -D o -i bootdisk.img lcfosc.bin :: - mcopy -D o -i bootdisk.img grub/menu.lst ::/grub - -CRT0 = kernel/goto64.o - -CFLAGS = -m64 \ - -nostdinc \ - -nostdlib \ - -nostartfiles \ - -mno-red-zone \ - -fno-builtin \ - -mcmodel=large \ - -Ipython/Include - -OBJECTS = \ - kernel/video.o \ - kernel/snprintf.o \ - kernel/kernel.o \ - kernel/asmcode.o \ - kernel/handlers.o \ - kernel/keyboard.o \ - kernel/klib.o \ - kernel/malloc.o \ - kernel/task.o \ - kernel/mm.o \ - kernel/timer.o - -lcfosc.bin: $(CRT0) $(OBJECTS) linker.ld - ld -T linker.ld -s -o lcfosc.bin $(CRT0) $(OBJECTS) - -%.o : %.asm Makefile - nasm -f elf64 -o $@ $< - -%.o : %.c Makefile - gcc $(CFLAGS) -o $@ -c $< -Wall -Wextra -Werror - -clean: - rm $(OBJECTS) $(CRT0) lcfosc.bin - diff -r 7f74363f4c82 -r 47b7df514243 cos/kernel/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cos/kernel/Makefile Wed Dec 28 13:38:43 2011 +0100 @@ -0,0 +1,29 @@ +# vim: set noexpandtab: + +all: bootdisk.img Makefile + +bootdisk.img: lcfosc.bin grub/menu.lst Makefile + cp grub/emptybootdisk.img bootdisk.img + mcopy -D o -i bootdisk.img lcfosc.bin :: + mcopy -D o -i bootdisk.img grub/menu.lst ::/grub + +CRT0 = goto64.o + +CFLAGS = -m64 -nostdinc -nostdlib -nostartfiles -mno-red-zone \ + -fno-builtin -mcmodel=large -Wall -Wextra -Werror + +OBJECTS = video.o snprintf.o kernel.o asmcode.o handlers.o keyboard.o \ + klib.o malloc.o task.o mm.o timer.o + +lcfosc.bin: $(CRT0) $(OBJECTS) link.ld + ld -T link.ld -s -o lcfosc.bin $(CRT0) $(OBJECTS) + +%.o : %.asm Makefile + nasm -f elf64 -o $@ $< + +%.o : %.c Makefile + gcc $(CFLAGS) -o $@ -c $< + +clean: + rm $(OBJECTS) $(CRT0) lcfosc.bin + diff -r 7f74363f4c82 -r 47b7df514243 cos/kernel/asmcode.asm --- a/cos/kernel/asmcode.asm Tue Dec 27 18:59:02 2011 +0100 +++ b/cos/kernel/asmcode.asm Wed Dec 28 13:38:43 2011 +0100 @@ -5,11 +5,6 @@ section .text align 4 -global halt -halt: - cli - hlt - ; Function to read the current instruction pointer value: global read_rip read_rip: @@ -25,7 +20,6 @@ loadIDT: extern idtP ; TODO: make this pointer thing more insightfull: - ;xchg bx, bx ; For debugging with bochs lidt [idtP] ret diff -r 7f74363f4c82 -r 47b7df514243 cos/kernel/kernel.c --- a/cos/kernel/kernel.c Tue Dec 27 18:59:02 2011 +0100 +++ b/cos/kernel/kernel.c Wed Dec 28 13:38:43 2011 +0100 @@ -23,6 +23,9 @@ setupIDT(); init_heap(); + //new_task(hello_program); + + // TODO: make below a user space program! printf("Welcome!\n"); while (1==1) @@ -44,6 +47,8 @@ { printf("Help\n Try one of these commands:\n"); printf(" x: print system time in ms\n"); + printf(" r: reboot\n"); + printf(" t: test\n"); } if (strncmp(buffer, "r", 1)) { diff -r 7f74363f4c82 -r 47b7df514243 cos/kernel/kernel.h --- a/cos/kernel/kernel.h Tue Dec 27 18:59:02 2011 +0100 +++ b/cos/kernel/kernel.h Wed Dec 28 13:38:43 2011 +0100 @@ -31,6 +31,8 @@ void* kmalloc(uint64_t size); void kfree(void* ptr); +void* kmalloc_int(uint64_t size); + // task related functions: void initialize_tasking(); void new_task(); @@ -38,8 +40,8 @@ // STDout funcs: void printf(const char* fmt, ... ); -void memset(void* ptr, uint32_t value, uint32_t num); -void memcpy(void* dst, void* src, uint32_t num); +void memset(void* ptr, uint8_t value, uint64_t num); +void memcpy(void* dst, void* src, uint64_t num); int strncmp(const char* s1, const char* s2, int size); // Screen related: @@ -151,5 +153,12 @@ console_t *console; } task_t; +// Memory manager functions: +typedef struct +{ + // TODO: other members here. + uint64_t frame; +} page_t; + #endif diff -r 7f74363f4c82 -r 47b7df514243 cos/kernel/klib.c --- a/cos/kernel/klib.c Tue Dec 27 18:59:02 2011 +0100 +++ b/cos/kernel/klib.c Wed Dec 28 13:38:43 2011 +0100 @@ -17,6 +17,12 @@ outb(0x64, 0xFE); } +void halt() +{ + asm volatile("cli"); + asm volatile("hlt"); +} + // IO port helpers: void outb(uint16_t port, uint8_t value) { @@ -48,3 +54,14 @@ return 1; } +// mem functions: +void memset(void* data, uint8_t value, uint64_t size) +{ + uint64_t i; + uint8_t *data2 = (uint8_t*)data; + for (i = 0; i < size; i++) + { + data2[i] = value; + } +} + diff -r 7f74363f4c82 -r 47b7df514243 cos/kernel/link.ld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cos/kernel/link.ld Wed Dec 28 13:38:43 2011 +0100 @@ -0,0 +1,25 @@ +OUTPUT_FORMAT("binary") + +SECTIONS { + .text 0x100000: + { + *(.text) + } + + .rodata ALIGN (4096) : + { + *(.rodata) + } + + .data ALIGN (4096) : + { + *(.data) + } + + .bss : { + *(.bss) + } + + end = .; +} + diff -r 7f74363f4c82 -r 47b7df514243 cos/kernel/malloc.c --- a/cos/kernel/malloc.c Tue Dec 27 18:59:02 2011 +0100 +++ b/cos/kernel/malloc.c Wed Dec 28 13:38:43 2011 +0100 @@ -1,5 +1,32 @@ #include "kernel.h" +// ================= Placement malloc: +extern uint64_t end; +uint64_t placement_address = (uint64_t)&end; + +void* kmalloc_int(uint64_t size) +{ + uint64_t tmp = placement_address; + placement_address += size; + return (void*)tmp; +} + +void* kmalloc_aligned_int(uint64_t size) +{ + if ( (placement_address | 0xFFF) != 0 ) + { + placement_address &= ~(0xFFF); + placement_address += 0x1000; + } + uint64_t tmp = placement_address; + placement_address += size; + return (void*)tmp; +} + + +// ================= Other malloc +// TODO: move this to user space? + #define HEAP_MAGIC 0xc0ffee #define HEAP_START 0x400000 #define HEAP_SIZE 0x200000 @@ -17,6 +44,7 @@ of the kernel into smaller parts. The heap is located at: 0x */ + static heap_t* kernel_heap = (heap_t*) 0x400000; // 4 MB - 6 MB is heap /* Allocates 'size' bytes and returns the pointer if succesfull. Kernelpanic in case of failure.. diff -r 7f74363f4c82 -r 47b7df514243 cos/kernel/mm.c --- a/cos/kernel/mm.c Tue Dec 27 18:59:02 2011 +0100 +++ b/cos/kernel/mm.c Wed Dec 28 13:38:43 2011 +0100 @@ -1,12 +1,14 @@ -/* Memory manager */ +/* Memory manager functions, + * + * Uses a bitmap to keep track of 4k pages that are in use. + * + * */ #include "kernel.h" -// BITMAP functions: -#define NFRAMES 1000 -// Bit mask to check what frames are in use and which are free: -uint64_t frames[NFRAMES]; // NFRAMES*64*4kB frames. +uint64_t *frames = 0; +uint64_t nframes = 0; void set_frame(uint64_t frame) { @@ -32,7 +34,7 @@ uint64_t first_frame() { uint64_t i, j; - for (i = 0; i < NFRAMES / 64; i++) + for (i = 0; i < nframes / 64; i++) { if (frames[i] != 0xFFFFFFFFFFFFFFFF) { @@ -50,6 +52,11 @@ } // Memory manager functions: +void init_memory(uint64_t total_mem_size) +{ + frames = (uint64_t*)kmalloc_int( ( total_mem_size / 4096 ) / 8 ); +} + void alloc_frame() { uint64_t idx = first_frame(); @@ -60,4 +67,9 @@ set_frame(idx); } +void free_frame(page_t *page) +{ + clear_frame(page->frame / 0x1000); + page->frame = 0; +} diff -r 7f74363f4c82 -r 47b7df514243 cos/kernel/task.c --- a/cos/kernel/task.c Tue Dec 27 18:59:02 2011 +0100 +++ b/cos/kernel/task.c Wed Dec 28 13:38:43 2011 +0100 @@ -1,3 +1,5 @@ +/* Scheduler functions */ + #include "kernel.h" // global variables: diff -r 7f74363f4c82 -r 47b7df514243 cos/kernel/timer.c --- a/cos/kernel/timer.c Tue Dec 27 18:59:02 2011 +0100 +++ b/cos/kernel/timer.c Wed Dec 28 13:38:43 2011 +0100 @@ -4,8 +4,8 @@ void timerDriverUpdate() { - ticks++; - task_scheduler(); + ticks++; + task_scheduler(); } uint64_t getTimeMS() diff -r 7f74363f4c82 -r 47b7df514243 cos/linker.ld --- a/cos/linker.ld Tue Dec 27 18:59:02 2011 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -OUTPUT_FORMAT("binary") - -SECTIONS { - .text 0x100000: - { - *(.text) - } - - .rodata ALIGN (4096) : - { - *(.rodata) - } - - .data ALIGN (4096) : - { - *(.data) - } - - .bss : { - *(.bss) - } - -} - diff -r 7f74363f4c82 -r 47b7df514243 cos/utils/bin2c.py --- a/cos/utils/bin2c.py Tue Dec 27 18:59:02 2011 +0100 +++ b/cos/utils/bin2c.py Wed Dec 28 13:38:43 2011 +0100 @@ -10,7 +10,7 @@ data = f.read() s = ', '.join(hex(b) for b in data) -output = 'unsigned char[] data = {{{0}}};'.format(s) +output = 'unsigned char data[] = {{{0}}};'.format(s) if len(sys.argv) < 3: print(output) else: