diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..47bd505 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.iso +isodir +sysroot diff --git a/kernel/Makefile b/kernel/Makefile index b12deb8..cef1f87 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -29,7 +29,8 @@ LIBS:=$(LIBS) $(KERNEL_ARCH_LIBS) KERNEL_OBJS=\ $(KERNEL_ARCH_OBJS) \ -kernel/kernel.o \ +rockos/kernel.o \ +rockos/paging.o \ OBJS=\ $(ARCHDIR)/boot/crti.o \ diff --git a/kernel/arch/i386/boot/boot.S b/kernel/arch/i386/boot/boot.S index 6ebe9b6..012bc8c 100644 --- a/kernel/arch/i386/boot/boot.S +++ b/kernel/arch/i386/boot/boot.S @@ -31,6 +31,7 @@ _start: call idt_init # initialize the IDT call PIC_remap sti + call paging_init call kernel_main # transfer control to main kernel # Hang if kernel_main unexpectedly returns 1: hlt diff --git a/kernel/arch/i386/boot/gdt.c b/kernel/arch/i386/boot/gdt.c index 982e4e0..d646df3 100644 --- a/kernel/arch/i386/boot/gdt.c +++ b/kernel/arch/i386/boot/gdt.c @@ -1,4 +1,4 @@ -#include +#include #include #include diff --git a/kernel/arch/i386/boot/idt.c b/kernel/arch/i386/boot/idt.c index 21a9a41..0b0a618 100644 --- a/kernel/arch/i386/boot/idt.c +++ b/kernel/arch/i386/boot/idt.c @@ -1,8 +1,16 @@ -#include +#include +#include #include +static unsigned char key; + __attribute__((interrupt)) void keyboard_handler(void* frame) { - return; + key = inb(0x60); + outb(0x20, 0x20); +} + +unsigned char readkey() { + return key; } __attribute__((interrupt)) void int_handler(void* frame, unsigned int number) { diff --git a/kernel/arch/i386/boot/pic.c b/kernel/arch/i386/boot/pic.c index 11b48b9..b9d39b1 100644 --- a/kernel/arch/i386/boot/pic.c +++ b/kernel/arch/i386/boot/pic.c @@ -1,13 +1,8 @@ -#include +#include #include void PIC_remap() { printf("Beginning PIC initialization.\n"); - - unsigned char a1, a2; - - a1 = inb(PIC1_DATA); // save masks - a2 = inb(PIC2_DATA); outb(PIC1_COMMAND, ICW1_INIT | ICW1_ICW4); // Start init sequence in cascade mode io_wait(); @@ -32,5 +27,4 @@ void PIC_remap() { outb(PIC2_DATA, 0xFF); outb(PIC1_DATA, 0xFD); // Keyboard IRQ - //outb(PIC2_DATA, 0xFF); } \ No newline at end of file diff --git a/kernel/arch/i386/make.config b/kernel/arch/i386/make.config index c2d1037..720f170 100644 --- a/kernel/arch/i386/make.config +++ b/kernel/arch/i386/make.config @@ -7,6 +7,5 @@ KERNEL_ARCH_OBJS=\ $(ARCHDIR)/boot/boot.o \ $(ARCHDIR)/vga/tty.o \ $(ARCHDIR)/boot/gdt.o \ -$(ARCHDIR)/paging/paging.o \ $(ARCHDIR)/boot/idt.o \ $(ARCHDIR)/boot/pic.o \ No newline at end of file diff --git a/kernel/arch/i386/paging/paging.S b/kernel/arch/i386/paging/paging.S deleted file mode 100644 index 3dbdd98..0000000 --- a/kernel/arch/i386/paging/paging.S +++ /dev/null @@ -1,22 +0,0 @@ -.text -.globl load_page_dir -load_page_dir: - push %ebp - mov %esp, %ebp - mov 8(%esp), %eax - mov %eax, %cr3 - mov %ebp, %esp - pop %ebp - ret - -.text -.globl enable_paging -enable_paging: - push %ebp - mov %esp, %ebp - mov %cr0, %eax - or $0x80000000, %eax - mov %eax, %cr0 - mov %ebp, %esp - pop %ebp - ret \ No newline at end of file diff --git a/kernel/arch/i386/vga/tty.c b/kernel/arch/i386/vga/tty.c index 3188a60..363a0db 100644 --- a/kernel/arch/i386/vga/tty.c +++ b/kernel/arch/i386/vga/tty.c @@ -3,7 +3,7 @@ #include #include -#include +#include #include "vga.h" diff --git a/kernel/include/kernel/paging.h b/kernel/include/kernel/paging.h deleted file mode 100644 index f30e004..0000000 --- a/kernel/include/kernel/paging.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _KERNEL_PAGING_H -#define _KERNEL_PAGING_H - -extern void load_page_dir(uint32_t*); -extern void enable_paging(); - -#endif \ No newline at end of file diff --git a/kernel/include/kernel/gdt.h b/kernel/include/rockos/gdt.h similarity index 87% rename from kernel/include/kernel/gdt.h rename to kernel/include/rockos/gdt.h index 3c7ebd6..2c01850 100644 --- a/kernel/include/kernel/gdt.h +++ b/kernel/include/rockos/gdt.h @@ -1,5 +1,5 @@ -#ifndef _KERNEL_GDT_H -#define _KERNEL_GDT_H +#ifndef _ROCKOS_GDT_H +#define _ROCKOS_GDT_H #include diff --git a/kernel/include/rockos/hal.h b/kernel/include/rockos/hal.h new file mode 100644 index 0000000..0101ac1 --- /dev/null +++ b/kernel/include/rockos/hal.h @@ -0,0 +1,16 @@ +#ifndef _ROCKOS_HAL_H +#define _ROCKOS_HAL_H + +#include + +static inline void outb(uint16_t port, uint8_t val) { + asm volatile("outb %0, %1" : : "a"(val), "Nd"(port)); +} + +static inline uint8_t inb(uint16_t port) { + uint8_t ret; + asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +#endif \ No newline at end of file diff --git a/kernel/include/kernel/idt.h b/kernel/include/rockos/idt.h similarity index 94% rename from kernel/include/kernel/idt.h rename to kernel/include/rockos/idt.h index 039812a..010b1be 100644 --- a/kernel/include/kernel/idt.h +++ b/kernel/include/rockos/idt.h @@ -1,5 +1,5 @@ -#ifndef _KERNEL_IDT_H -#define _KERNEL_IDT_H +#ifndef _ROCKOS_IDT_H +#define _ROCKOS_IDT_H #include @@ -44,4 +44,6 @@ static char* err_msg[] = { "#CP Control Protection Exception!" }; +unsigned char readkey(); + #endif \ No newline at end of file diff --git a/kernel/include/rockos/irq.h b/kernel/include/rockos/irq.h new file mode 100644 index 0000000..e69de29 diff --git a/kernel/include/rockos/paging.h b/kernel/include/rockos/paging.h new file mode 100644 index 0000000..c05dda5 --- /dev/null +++ b/kernel/include/rockos/paging.h @@ -0,0 +1,7 @@ +#ifndef _ROCKOS_PAGING_H +#define _ROCKOS_PAGING_H + +#define PAGE_ENTRIES 1024 +#define PAGE_SIZE 4 * PAGE_ENTRIES + +#endif \ No newline at end of file diff --git a/kernel/include/kernel/pic.h b/kernel/include/rockos/pic.h similarity index 77% rename from kernel/include/kernel/pic.h rename to kernel/include/rockos/pic.h index be1599c..87dfba6 100644 --- a/kernel/include/kernel/pic.h +++ b/kernel/include/rockos/pic.h @@ -1,7 +1,8 @@ -#ifndef _KERNEL_PIC_H -#define _KERNEL_PIC_H +#ifndef _ROCKOS_PIC_H +#define _ROCKOS_PIC_H #include +#include #define PIC1 0x20 #define PIC1_COMMAND 0x20 @@ -27,16 +28,6 @@ #define ICW4_BUF_MASTER 0x0C // Buffered mode/master #define ICW4_SFNM 0x10 // Special fully nested (not) -static inline void outb(uint16_t port, uint8_t val) { - asm volatile("outb %0, %1" : : "a"(val), "Nd"(port)); -} - -static inline uint8_t inb(uint16_t port) { - uint8_t ret; - asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port)); - return ret; -} - static inline void io_wait() { outb(0x80, 0); } diff --git a/kernel/include/kernel/tty.h b/kernel/include/rockos/tty.h similarity index 81% rename from kernel/include/kernel/tty.h rename to kernel/include/rockos/tty.h index f5d7329..2c3dfb3 100644 --- a/kernel/include/kernel/tty.h +++ b/kernel/include/rockos/tty.h @@ -1,5 +1,5 @@ -#ifndef _KERNEL_TTY_H -#define _KERNEL_TTY_H +#ifndef _ROCKOS_TTY_H +#define _ROCKOS_TTY_H #include diff --git a/kernel/rockos/kernel.c b/kernel/rockos/kernel.c new file mode 100644 index 0000000..8a9cf9c --- /dev/null +++ b/kernel/rockos/kernel.c @@ -0,0 +1,24 @@ +#include + +#include +#include + +void kernel_main(void) { + printf("Hello, kernel World!\n"); + printf("String test: %s\n", "HELLOOOOO"); + printf("Float test: %.10f\n", 0.123456789); + printf("Int test: %d\n", 747474); + printf("Hex test: 0x%x\n", 0xDEADBEEF); + printf("And now for 0.1 + 0.2...... which is: %.17f\n", 0.1 + 0.2); + + unsigned char oldkey; + unsigned char key = readkey(); + for(;;){ + oldkey = key; + key = readkey(); + if (key != oldkey) + putchar(key); + } + + asm("cli; hlt"); +} diff --git a/kernel/kernel/kernel.c b/kernel/rockos/paging.c similarity index 54% rename from kernel/kernel/kernel.c rename to kernel/rockos/paging.c index 671f66e..e9fb96e 100644 --- a/kernel/kernel/kernel.c +++ b/kernel/rockos/paging.c @@ -1,12 +1,22 @@ -#include +#include +#include -#include -#include -#include -#include +void load_page_dir(uint32_t page_dir) { + asm volatile ( + "mov %%eax, %%cr3" + : + : "a"(page_dir) + : "memory" + ); +} -#define PAGE_ENTRIES 1024 -#define PAGE_SIZE 4 * PAGE_ENTRIES +void enable_paging() { + asm volatile ( + "mov %cr0, %eax\n" + "or $0x80000000, %eax\n" + "mov %eax, %cr0" + ); +} void paging_init() { uint32_t page_dir[PAGE_ENTRIES] __attribute__((aligned(PAGE_SIZE))); @@ -28,25 +38,4 @@ void paging_init() { load_page_dir(page_dir); enable_paging(); -} - -void kernel_main(void) { - paging_init(); - printf("Hello, kernel World!\n"); - printf("String test: %s\n", "HELLOOOOO"); - printf("Float test: %.10f\n", 0.123456789); - printf("Int test: %d\n", 747474); - printf("Hex test: 0x%x\n", 0xDEADBEEF); - printf("And now for 0.1 + 0.2...... which is: %.17f\n", 0.1 + 0.2); - - unsigned char c, cold; - for(;;){ - cold = c; - c = inb(0x60); - if (cold != c) - putchar(c); - outb(0x20, 0x20); - } - - asm("cli; hlt"); -} +} \ No newline at end of file diff --git a/libc/stdio/putchar.c b/libc/stdio/putchar.c index 47be92b..5b8b470 100644 --- a/libc/stdio/putchar.c +++ b/libc/stdio/putchar.c @@ -1,7 +1,7 @@ #include #if defined(__is_libk) -#include +#include #endif int putchar(int ic) {