From 71396c5cd460890c52e348687e6e7c864e2dfeed Mon Sep 17 00:00:00 2001 From: Aleksa Vuckovic Date: Sun, 7 Aug 2022 16:39:28 +0200 Subject: types.h; libk and heap begining --- kernel/Makefile | 3 +++ kernel/include/debug.h | 2 -- kernel/include/font.h | 18 +++++++++--------- kernel/include/graphics.h | 2 +- kernel/include/heap.h | 14 ++++++++++++++ kernel/include/idt.h | 16 ++++++++-------- kernel/include/io.h | 2 +- kernel/include/irq.h | 2 +- kernel/include/keyboard.h | 7 ++++--- kernel/include/keymap.h | 2 +- kernel/include/libk/math.h | 8 ++++++++ kernel/include/libk/string.h | 11 +++++++++++ kernel/include/multiboot2.h | 2 +- kernel/include/types.h | 8 ++++++++ kernel/src/boot/multiboot2.c | 3 ++- kernel/src/cpu/io.c | 2 +- kernel/src/cpu/irq.c | 3 ++- kernel/src/devices/keyboard.c | 36 ++++++++++-------------------------- kernel/src/libk/math.c | 7 +++++++ kernel/src/libk/mem.c | 0 kernel/src/libk/string.c | 43 +++++++++++++++++++++++++++++++++++++++++++ kernel/src/main.c | 8 +++++++- kernel/src/mem/heap.c | 16 ++++++++++++++++ kernel/src/mem/paging.c | 3 ++- kernel/src/mem/paging_asm.S | 12 ++++++------ kernel/src/misc/debug.c | 2 -- kernel/src/misc/graphics.c | 18 ++++-------------- 27 files changed, 170 insertions(+), 80 deletions(-) create mode 100644 kernel/include/heap.h create mode 100644 kernel/include/libk/math.h create mode 100644 kernel/include/libk/string.h create mode 100644 kernel/include/types.h create mode 100644 kernel/src/libk/math.c create mode 100644 kernel/src/libk/mem.c create mode 100644 kernel/src/libk/string.c create mode 100644 kernel/src/mem/heap.c diff --git a/kernel/Makefile b/kernel/Makefile index d7a9fd5..22f5775 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -11,7 +11,10 @@ OBJS = \ src/cpu/irq_stub.o \ src/cpu/pic.o \ src/devices/keyboard.o \ + src/libk/math.o \ + src/libk/string.o \ src/main.o \ + src/mem/heap.o \ src/mem/paging_asm.o \ src/mem/paging.o \ src/misc/debug.o \ diff --git a/kernel/include/debug.h b/kernel/include/debug.h index ebe3a52..74648b9 100644 --- a/kernel/include/debug.h +++ b/kernel/include/debug.h @@ -1,8 +1,6 @@ #ifndef DEBUG_H #define DEBUG_H -#include - void bochs_breakpoint(void); #endif diff --git a/kernel/include/font.h b/kernel/include/font.h index 2bb00fa..f405a90 100644 --- a/kernel/include/font.h +++ b/kernel/include/font.h @@ -1,19 +1,19 @@ #ifndef FONT_H #define FONT_H -#include +#include #define PSF_FONT_MAGIC 0x864ab572 typedef struct { - uint32_t magic; /* magic bytes to identify PSF */ - uint32_t version; /* zero */ - uint32_t headersize; /* offset of bitmaps in file, 32 */ - uint32_t flags; /* 0 if there's no unicode table */ - uint32_t numglyph; /* number of glyphs */ - uint32_t bytesperglyph; /* size of each glyph */ - uint32_t height; /* height in pixels */ - uint32_t width; /* width in pixels */ + uint32_t magic; /* magic bytes to identify PSF */ + uint32_t version; /* zero */ + uint32_t headersize; /* offset of bitmaps in file, 32 */ + uint32_t flags; /* 0 if there's no unicode table */ + uint32_t numglyph; /* number of glyphs */ + uint32_t bytesperglyph; /* size of each glyph */ + uint32_t height; /* height in pixels */ + uint32_t width; /* width in pixels */ } PSF_font; /* font i used: /usr/share/kbd/consolefonts/lat9-16.psf.gz */ diff --git a/kernel/include/graphics.h b/kernel/include/graphics.h index 84505d8..2714f62 100644 --- a/kernel/include/graphics.h +++ b/kernel/include/graphics.h @@ -1,7 +1,7 @@ #ifndef GRAPHICS_H #define GRAPHICS_H -#include +#include struct fb_t { uint64_t addr; diff --git a/kernel/include/heap.h b/kernel/include/heap.h new file mode 100644 index 0000000..ae846bd --- /dev/null +++ b/kernel/include/heap.h @@ -0,0 +1,14 @@ +#ifndef HEAP_H +#define HEAP_H + +#include + +#define HEAP_START_ADDR 0x00200000 +#define HEAP_SIZE 0x00100000 +#define HEAP_BLOCK_SIZE 0x00000100 + +void init_heap(uint64_t addr, uint64_t size, uint64_t block_size); +void* kmalloc(uint32_t size); +void kfree(void *addr); + +#endif diff --git a/kernel/include/idt.h b/kernel/include/idt.h index 9ca9c3a..cc2278a 100644 --- a/kernel/include/idt.h +++ b/kernel/include/idt.h @@ -1,7 +1,7 @@ #ifndef IDT_H #define IDT_H -#include +#include #define GDT_CODE_SEG 0x08 @@ -9,13 +9,13 @@ #define TRAP_GATE 0x8F struct idt_entry { - uint16_t offset_1; // offset bits 0..15 - uint16_t selector; // a code segment selector in GDT or LDT - uint8_t ist; // bits 0..2 holds Interrupt Stack Table offset, rest of bits zero. - uint8_t type_attributes; // gate type, dpl, and p fields - uint16_t offset_2; // offset bits 16..31 - uint32_t offset_3; // offset bits 32..63 - uint32_t zero; // reserved + uint16_t offset_1; // offset bits 0..15 + uint16_t selector; // a code segment selector in GDT or LDT + uint8_t ist; // bits 0..2 holds Interrupt Stack Table offset, rest of bits zero. + uint8_t type_attributes; // gate type, dpl, and p fields + uint16_t offset_2; // offset bits 16..31 + uint32_t offset_3; // offset bits 32..63 + uint32_t zero; // reserved } __attribute__((packed)); typedef struct idt_entry idt_entry; diff --git a/kernel/include/io.h b/kernel/include/io.h index 76c401d..d47abb3 100644 --- a/kernel/include/io.h +++ b/kernel/include/io.h @@ -1,7 +1,7 @@ #ifndef IO_H #define IO_H -#include +#include uint8_t inb(uint32_t port); void outb(uint32_t port, uint8_t value); diff --git a/kernel/include/irq.h b/kernel/include/irq.h index f0e38d6..2f22aff 100644 --- a/kernel/include/irq.h +++ b/kernel/include/irq.h @@ -1,7 +1,7 @@ #ifndef IRQ_H #define IRQ_H -#include +#include // exceptions void isr0(void); diff --git a/kernel/include/keyboard.h b/kernel/include/keyboard.h index 050507d..5d7acd0 100644 --- a/kernel/include/keyboard.h +++ b/kernel/include/keyboard.h @@ -1,15 +1,16 @@ #ifndef KEYBOARD_H #define KEYBOARD_H -#include +#include #define KEYBOARD_DATA_PORT 0x60 #define KEYBOARD_STATUS_PORT 0x64 -uint32_t stoi(const char *s); -void itos(uint32_t num, char** s); +uint64_t stoi(const char *s); +void itos(uint64_t num, char* s); void print_char(char c); void print_string(char* s); void keyboard_handler(void); +void print_int(uint64_t num); #endif diff --git a/kernel/include/keymap.h b/kernel/include/keymap.h index c027146..c9b8697 100644 --- a/kernel/include/keymap.h +++ b/kernel/include/keymap.h @@ -1,7 +1,7 @@ #ifndef KEYMAP_H #define KEYMAP_H -#include +#include #define KEY_ESCAPE 0x01 #define KEY_1 0x02 diff --git a/kernel/include/libk/math.h b/kernel/include/libk/math.h new file mode 100644 index 0000000..83ac7fe --- /dev/null +++ b/kernel/include/libk/math.h @@ -0,0 +1,8 @@ +#ifndef MATH_H +#define MATH_H + +#include + +int64_t abs(int64_t val); + +#endif diff --git a/kernel/include/libk/string.h b/kernel/include/libk/string.h new file mode 100644 index 0000000..64a7f81 --- /dev/null +++ b/kernel/include/libk/string.h @@ -0,0 +1,11 @@ +#ifndef STRING_H +#define STRING_H + +#include + +size_t strlen(const char* s); +uint64_t stoi(const char *s); +void itos(uint64_t num, char* s); +void strrev(char *s); + +#endif diff --git a/kernel/include/multiboot2.h b/kernel/include/multiboot2.h index f22fd8e..e7935a6 100644 --- a/kernel/include/multiboot2.h +++ b/kernel/include/multiboot2.h @@ -1,7 +1,7 @@ #ifndef MULTIBOOT2_H #define MULTIBOOT2_H -#include +#include struct mb2_tag_header { uint32_t type; diff --git a/kernel/include/types.h b/kernel/include/types.h new file mode 100644 index 0000000..b5f54be --- /dev/null +++ b/kernel/include/types.h @@ -0,0 +1,8 @@ +#ifndef TYPES_H +#define TYPES_H + +#include +#include +#include + +#endif diff --git a/kernel/src/boot/multiboot2.c b/kernel/src/boot/multiboot2.c index e228ce1..2badae9 100644 --- a/kernel/src/boot/multiboot2.c +++ b/kernel/src/boot/multiboot2.c @@ -1,4 +1,5 @@ -#include +#include + #include #include diff --git a/kernel/src/cpu/io.c b/kernel/src/cpu/io.c index 6bf67d0..a73c5b1 100644 --- a/kernel/src/cpu/io.c +++ b/kernel/src/cpu/io.c @@ -1,4 +1,4 @@ -#include +#include uint8_t inb(uint32_t port) { diff --git a/kernel/src/cpu/irq.c b/kernel/src/cpu/irq.c index 1e02f23..c81cc98 100644 --- a/kernel/src/cpu/irq.c +++ b/kernel/src/cpu/irq.c @@ -1,4 +1,5 @@ -#include +#include + #include #include #include diff --git a/kernel/src/devices/keyboard.c b/kernel/src/devices/keyboard.c index d4b06b9..f873a29 100644 --- a/kernel/src/devices/keyboard.c +++ b/kernel/src/devices/keyboard.c @@ -1,11 +1,11 @@ -#include -#include +#include #include #include #include #include #include +#include #define KEYBOARD_DATA_PORT 0x60 #define KEYBOARD_STATUS_PORT 0x64 @@ -14,29 +14,6 @@ static uint32_t x; static uint32_t y; bool is_pressed[128]; -uint32_t strlen(const char *s); - -uint32_t stoi(const char *s) -{ - static uint32_t num; - uint32_t s_len = strlen(s); - - for (int i = s_len - 1; i >= 0; i--) { - num += s[i] - '0'; - } - - return num; -} - -void itos(uint32_t num, char** s) -{ - uint32_t i; - for (i = 0; num; num/=10, i++) { - *s[i] = num%10 - '0'; - } - *s[i] = '\0'; -} - void print_char(char c) { @@ -59,11 +36,18 @@ void print_char(char c) void print_string(char* s) { - for (uint32_t i = 0; i < strlen(s); i++) { + for (size_t i = 0; i < strlen(s); i++) { print_char(s[i]); } } +void print_int(uint64_t num) +{ + char a[100]; + itos(num, a); + print_string(a); +} + void keyboard_handler(void) { uint8_t status = inb(KEYBOARD_STATUS_PORT); diff --git a/kernel/src/libk/math.c b/kernel/src/libk/math.c new file mode 100644 index 0000000..c2f9c5e --- /dev/null +++ b/kernel/src/libk/math.c @@ -0,0 +1,7 @@ +#include + +int64_t abs(int64_t val) +{ + if (val < 0) return -val; + return val; +} diff --git a/kernel/src/libk/mem.c b/kernel/src/libk/mem.c new file mode 100644 index 0000000..e69de29 diff --git a/kernel/src/libk/string.c b/kernel/src/libk/string.c new file mode 100644 index 0000000..a4d0191 --- /dev/null +++ b/kernel/src/libk/string.c @@ -0,0 +1,43 @@ +#include + +size_t strlen(const char* s) +{ + char *p = (char*)s; + while (*p) p++; + return p - s; +} + +uint64_t stoi(const char *s) +{ + uint64_t num = 0; + size_t n = strlen(s); + + for (size_t i = 0; i < n; i++) { + num *= 10; + num += s[i] - '0'; + } + + return num; +} + +void strrev(char *s) +{ + size_t n = strlen(s); + char a[100]; + for (size_t i = 0; i < n; i++) { + a[i] = s[n - 1 - i]; + } + for (size_t i = 0; i < n; i++) { + s[i] = a[i]; + } +} + +void itos(uint64_t num, char* s) +{ + size_t i; + for (i = 0; num; num/=10, i++) { + s[i] = '0' + num%10; + } + s[i] = '\0'; + strrev(s); +} diff --git a/kernel/src/main.c b/kernel/src/main.c index bea4ed2..8a57d45 100644 --- a/kernel/src/main.c +++ b/kernel/src/main.c @@ -1,16 +1,22 @@ -#include +#include + #include #include #include #include #include +#include +#include int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) { init_paging(); + init_heap(HEAP_START_ADDR, HEAP_SIZE, HEAP_BLOCK_SIZE); init_idt(); init_fb(multiboot_bootinfo, multiboot_magic); + print_int(0x1000); + for(;;) { __asm__ volatile ("hlt;"); } diff --git a/kernel/src/mem/heap.c b/kernel/src/mem/heap.c new file mode 100644 index 0000000..545f6ea --- /dev/null +++ b/kernel/src/mem/heap.c @@ -0,0 +1,16 @@ +#include + +void init_heap(uint64_t addr, uint64_t size, uint64_t block_size) +{ + +} + +void* kmalloc(uint32_t size) +{ + return (uint64_t*)0x0; +} + +void kfree(void *addr) +{ + +} diff --git a/kernel/src/mem/paging.c b/kernel/src/mem/paging.c index aa7f91e..3f9e2f5 100644 --- a/kernel/src/mem/paging.c +++ b/kernel/src/mem/paging.c @@ -1,4 +1,5 @@ -#include +#include + #include void load_pt_lvl4(uint64_t*); diff --git a/kernel/src/mem/paging_asm.S b/kernel/src/mem/paging_asm.S index 5a1dcf7..508930f 100644 --- a/kernel/src/mem/paging_asm.S +++ b/kernel/src/mem/paging_asm.S @@ -2,11 +2,11 @@ .global load_pt_lvl4 load_pt_lvl4: - push %rbp - mov %rsp, %rbp + push %rbp + mov %rsp, %rbp - mov %rdi, %cr3 + mov %rdi, %cr3 - mov %rbp, %rsp - pop %rbp - ret + mov %rbp, %rsp + pop %rbp + ret diff --git a/kernel/src/misc/debug.c b/kernel/src/misc/debug.c index 5f3c327..2a940d3 100644 --- a/kernel/src/misc/debug.c +++ b/kernel/src/misc/debug.c @@ -1,5 +1,3 @@ -#include - void bochs_breakpoint(void) { __asm__ volatile ("xchgw %bx, %bx;"); diff --git a/kernel/src/misc/graphics.c b/kernel/src/misc/graphics.c index d4fc7c7..488e4fa 100644 --- a/kernel/src/misc/graphics.c +++ b/kernel/src/misc/graphics.c @@ -1,7 +1,10 @@ -#include +#include + #include #include #include +#include +#include uint64_t* pixel_offset(fb_t fb, uint32_t x, uint32_t y) { @@ -65,12 +68,6 @@ void fb_draw_line_high(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, } } -int32_t abs(int32_t val) -{ - if (val < 0) return -val; - return val; -} - void fb_draw_line(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t col) { if (abs(y1 - y0) < abs(x1 - x0)) { @@ -104,13 +101,6 @@ void fb_draw_character(fb_t fb, char c, uint32_t x, uint32_t y, uint32_t char_co } } -uint32_t strlen(const char* s) -{ - char *p = (char*)s; - while (*p) p++; - return p - s; -} - void fb_draw_string(fb_t fb, const char* s, uint32_t x, uint32_t y, uint32_t char_col, uint32_t bg_col) { for (uint32_t i = 0; i < strlen(s); i++) { -- cgit v1.2.3