diff --git a/Makefile b/Makefile index d0e184e..c2585fb 100644 --- a/Makefile +++ b/Makefile @@ -59,8 +59,8 @@ image.bin: mbr.bin fs.img cat $^ >$@ kernel.bin: kernel.o console.o drivers/vga.o drivers/keyboard.o \ - string.o drivers/ata.o cpu/vectors.o cpu/idt.o cpu/gdt.o drivers/uart.o \ - fs/fs.o + drivers/ata.o cpu/vectors.o cpu/idt.o cpu/gdt.o drivers/uart.o \ + fs/fs.o lib/mem.o lib/string.o $(LD) $(LDFLAGS) -o $@ -Ttext 0x1000 $^ %.o: %.c diff --git a/drivers/keyboard.c b/drivers/keyboard.c index f64a084..d7ade6e 100644 --- a/drivers/keyboard.c +++ b/drivers/keyboard.c @@ -2,6 +2,7 @@ #include "../cpu/isr.h" #include "../console.h" #include "port.h" +#include "../lib/mem.h" static const char sc_ascii[] = { '?', '?', '1', '2', '3', '4', '5', '6', @@ -11,11 +12,13 @@ static const char sc_ascii[] = { 'b', 'n', 'm', ',', '.', '/', '?', '?', '?', ' ', }; +enum { kbd_buf_capacity = 1024 }; + static void interrupt_handler(registers_t *r) { uint8_t scancode = port_byte_in(0x60); if (scancode < sizeof(sc_ascii)) { char c = sc_ascii[scancode]; - if (kbd_buf_size < 1024) { + if (kbd_buf_size < kbd_buf_capacity) { kbd_buf[kbd_buf_size++] = c; } char string[] = {c, '\0'}; @@ -27,7 +30,7 @@ char* kbd_buf; unsigned kbd_buf_size; void init_keyboard() { - kbd_buf = (char*)(1 << 20); + kbd_buf = kmalloc(kbd_buf_capacity); register_interrupt_handler(IRQ1, interrupt_handler); } diff --git a/lib/mem.c b/lib/mem.c new file mode 100644 index 0000000..0bf188b --- /dev/null +++ b/lib/mem.c @@ -0,0 +1,12 @@ +#include "mem.h" + +static void* freeptr; + +void* kmalloc(size_t size) { + if (!freeptr) { + freeptr = (void*)(1<<20); + } + void* result = freeptr; + freeptr += size; + return result; +} diff --git a/lib/mem.h b/lib/mem.h new file mode 100644 index 0000000..1a77610 --- /dev/null +++ b/lib/mem.h @@ -0,0 +1,5 @@ +#pragma once + +typedef unsigned size_t; + +void* kmalloc(size_t size);