diff --git a/README.md b/README.md index 0d958d3..8ba54f7 100644 --- a/README.md +++ b/README.md @@ -2,26 +2,9 @@ # BlankOS -Rewritten monolithic, ring 0, lower-half, singletasking kernel for the x86 processor architecture, using GRUB (eltorito) as bootloader. Emulation was tested on QEMU using Arch Linux 6.9.7-arch1-1, and on real hardware too. +Rewritten monolithic, ring 0, lower-half, singletasking kernel for the x86 processor architecture, using GRUB 2 as bootloader. Emulation was tested on QEMU using Arch Linux 6.9.7-arch1-1, and on real hardware too. The long-term goal of this OS is to be capable of running user programs and having its own complete kernel C library so that users can write their own C programs and expand the system! -## Features - -- Serial port driver (output & debug) -- Framebuffer driver (output) -- PS/2 Keyboard and PIC driver (input) -- PIT (system clock/timer) driver -- Working IDT, GDT, ISRs, and IRQs -- Kernel panicking (exception handling) -- A kernel-space shell -- Cool color output!! -- Some small working kernel-space programs, such as... -- A brainfuck interpreter -- An arithmetic calculator -- ROT13 and Morse cipher programs -- Conway's Game of Life -- And some more... - ## Usage Download the latest BlankOS disk image from the "Releases" tab, and start it using the QEMU emulator: @@ -54,19 +37,6 @@ sudo dd bs=4M if=blankos.iso of=/dev/sdX status=progress oflag=sync Replace `sdX` with your USB drive name (you can find it by doing `sudo fdisk -l`). Tada! You now have a working BlankOS USB stick. Go ahead and try it out! -## Debugging (QEMU w/ GDB) - -``` -make debug -``` - -In another shell: - -``` -gdb kernel.elf -(gdb) target remote localhost:1234 -``` - ## Documentation Two other documents are available to help you understand the project better. One is the User's Manual, labelled [USERS.md](docs/USERS.md), and the other one is the Developer's Manual, labelled [DEVELOPERS.md](docs/DEVELOPERS.md). They are full of useful resources around Blank OS. You'll learn how to use the system and how to contribute to it. *(The docs might not always be up-to-date)* @@ -82,7 +52,7 @@ Two other documents are available to help you understand the project better. One - Ralf Brown's Interrupt List - the [little book about OS development](https://littleosbook.github.io/) by Erik Helin and Adam Renberg -### Roadmap +### Features / Roadmap - [X] Booting with GRUB - [X] Common basic structures (IDT, GDT, ISRs, IRQs) @@ -95,7 +65,7 @@ Two other documents are available to help you understand the project better. One - [ ] Getting to Ring-3 (userspace) - [ ] Multitasking (via round robin scheduling) - [ ] Advanced/other drivers (video, SB16, RTC, Ethernet) -- [ ] UEFI support +- [X] UEFI support - [ ] ELF parsing - [ ] System calls - [ ] GUI diff --git a/docs/DEVELOPERS.md b/docs/DEVELOPERS.md index 34a2609..760e985 100644 --- a/docs/DEVELOPERS.md +++ b/docs/DEVELOPERS.md @@ -14,6 +14,19 @@ The source code is available in folder `src`. You will find subfolders correspon No system calls are available, as the OS runs in kernel-space. +## Debugging the kernel (QEMU w/ GDB) + +``` +make debug +``` + +In another shell: + +``` +gdb kernel.elf +(gdb) target remote localhost:1234 +``` + ## Making programs for the OS ### Step 1 - Making the program and the entry point diff --git a/docs/USERS.md b/docs/USERS.md index 5759364..1185b0c 100644 --- a/docs/USERS.md +++ b/docs/USERS.md @@ -2,6 +2,25 @@ ## Getting started +First, let me introduce you some features of this project. + +## Features + +- Serial port driver (output & debug) +- Framebuffer driver (output) +- PS/2 Keyboard and PIC driver (input) +- PIT (system clock/timer) driver +- Working IDT, GDT, ISRs, and IRQs +- Kernel panicking (exception handling) +- A kernel-space shell +- Cool color output!! +- Some small working kernel-space programs, such as... +- A brainfuck interpreter +- An arithmetic calculator +- ROT13 and Morse cipher programs +- Conway's Game of Life +- And some more... + ### Installation and emulation/execution Please refer to the relevant sections in the project `README.md` available in the root folder. diff --git a/makefile b/makefile index 918e65e..c4b4871 100644 --- a/makefile +++ b/makefile @@ -1,5 +1,5 @@ CC = i386-elf-7.5.0-Linux-x86_64/bin/i386-elf-gcc -CFLAGS = -g -Wall -Wextra -Wno-builtin-declaration-mismatch -c -I src/ +CFLAGS = -ffreestanding -g -Wall -Wextra -Wno-builtin-declaration-mismatch -c -I src/ LDFLAGS = -T link.ld -melf_i386 AS = nasm ASFLAGS = -f elf diff --git a/src/drivers/ata.c b/src/drivers/ata.c index 4582d6a..bdcc09f 100644 --- a/src/drivers/ata.c +++ b/src/drivers/ata.c @@ -1,27 +1,12 @@ -#include "../libc/stdint.h" +// ATA PIO driver implementation +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + +#include #include "../kernel/io.h" #include "../libc/stdio.h" - -#define ATA_PRIMARY_IO 0x1F0 -#define ATA_PRIMARY_CTRL 0x3F6 -#define ATA_CMD_READ_PIO 0x20 -#define ATA_CMD_WRITE_PIO 0x30 -#define ATA_IDENTIFY 0xEC - -#define ATA_REG_DATA 0x00 -#define ATA_REG_ERROR 0x01 -#define ATA_REG_SECCOUNT0 0x02 -#define ATA_REG_LBA0 0x03 -#define ATA_REG_LBA1 0x04 -#define ATA_REG_LBA2 0x05 -#define ATA_REG_HDDEVSEL 0x06 -#define ATA_REG_COMMAND 0x07 -#define ATA_REG_STATUS 0x07 - -#define ATA_SR_BSY 0x80 -#define ATA_SR_DRDY 0x40 -#define ATA_SR_DRQ 0x08 -#define ATA_SR_ERR 0x01 +#include "ata.h" static inline uint16_t inw(uint16_t port) { uint16_t result; diff --git a/src/drivers/ata.h b/src/drivers/ata.h index 550645c..8eb11d3 100644 --- a/src/drivers/ata.h +++ b/src/drivers/ata.h @@ -1,6 +1,34 @@ +// ATA PIO driver implementation header +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #ifndef ATA_H #define ATA_H +#include + +#define ATA_PRIMARY_IO 0x1F0 +#define ATA_PRIMARY_CTRL 0x3F6 +#define ATA_CMD_READ_PIO 0x20 +#define ATA_CMD_WRITE_PIO 0x30 +#define ATA_IDENTIFY 0xEC + +#define ATA_REG_DATA 0x00 +#define ATA_REG_ERROR 0x01 +#define ATA_REG_SECCOUNT0 0x02 +#define ATA_REG_LBA0 0x03 +#define ATA_REG_LBA1 0x04 +#define ATA_REG_LBA2 0x05 +#define ATA_REG_HDDEVSEL 0x06 +#define ATA_REG_COMMAND 0x07 +#define ATA_REG_STATUS 0x07 + +#define ATA_SR_BSY 0x80 +#define ATA_SR_DRDY 0x40 +#define ATA_SR_DRQ 0x08 +#define ATA_SR_ERR 0x01 + void ata_read_sector(uint32_t lba, uint8_t* buffer); void test_read_sector(); diff --git a/src/drivers/framebuffer.c b/src/drivers/framebuffer.c index 528b0dd..9b4b231 100644 --- a/src/drivers/framebuffer.c +++ b/src/drivers/framebuffer.c @@ -1,11 +1,16 @@ -#include "../libc/stdint.h" +// Framebuffer driver +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + +#include #include "framebuffer.h" #include "serial.h" #include "../kernel/system.h" -//extern uint32_t *g_framebuffer; +extern char* framebuffer; -void putpixel(uint32_t* fb, int pitch, int bpp, int x, int y, uint32_t color) // framebuffer pointer, x, y, color +void putpixel(uint32_t* fb, int pitch, int bpp, int x, int y, uint32_t color) { if (bpp == 32) { uint32_t* pixel_addr = (uint32_t*)((uint8_t*)fb + y * pitch + x *(bpp / 8)); @@ -13,14 +18,6 @@ void putpixel(uint32_t* fb, int pitch, int bpp, int x, int y, uint32_t color) // } } -extern char* framebuffer; -extern int scanline; -extern char _binary_include_fonts_UniCyr_8x16_psf_start; -uint16_t* unicode; - -#define PIXEL uint32_t - -// Character, cursor X, cursor Y, foreground, background void draw_char(unsigned short int c, int cx, int cy, uint32_t fg, uint32_t bg) { PSF_font *font = (PSF_font*)&_binary_include_fonts_UniCyr_8x16_psf_start; diff --git a/src/drivers/framebuffer.h b/src/drivers/framebuffer.h index 5a2a8ff..84ded03 100644 --- a/src/drivers/framebuffer.h +++ b/src/drivers/framebuffer.h @@ -1,6 +1,19 @@ +// Framebuffer driver header +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #ifndef FRAMEBUFFER_H #define FRAMEBUFFER_H +#include + +extern int scanline; +extern char _binary_include_fonts_UniCyr_8x16_psf_start; +uint16_t* unicode; + +#define PIXEL uint32_t + #define PSF1_FONT_MAGIC 0x0436 typedef struct { @@ -9,7 +22,6 @@ typedef struct { uint8_t characterSize; // PSF character size. } PSF1_Header; - #define PSF_FONT_MAGIC 0x864ab572 typedef struct { @@ -23,7 +35,6 @@ typedef struct { uint32_t width; /* width in pixels */ } PSF_font; -//extern const unsigned char font[512][64]; void putpixel(uint32_t* fb, int pitch, int bpp, int x, int y, uint32_t color); void draw_char(unsigned short int c, int cx, int cy, uint32_t fg, uint32_t bg); void scroll(); diff --git a/src/drivers/kb.c b/src/drivers/kb.c index d5c7986..f4c556c 100644 --- a/src/drivers/kb.c +++ b/src/drivers/kb.c @@ -1,13 +1,12 @@ +// Keyboard driver +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #include "../kernel/io.h" #include "../libc/stdio.h" #include "../kernel/system.h" - -#define KEYBOARD_BUFFER_SIZE 256 - -#define LEFT_SHIFT_PRESSED 0x2A -#define RIGHT_SHIFT_PRESSED 0x36 -#define LEFT_SHIFT_RELEASED 0xAA -#define RIGHT_SHIFT_RELEASED 0xB6 +#include "kb.h" unsigned char kbdus[128] = { diff --git a/src/drivers/kb.h b/src/drivers/kb.h index f50cab5..d40730f 100644 --- a/src/drivers/kb.h +++ b/src/drivers/kb.h @@ -1,6 +1,18 @@ +// Keyboard driver header +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #ifndef KB_H #define KB_H +#define KEYBOARD_BUFFER_SIZE 256 + +#define LEFT_SHIFT_PRESSED 0x2A +#define RIGHT_SHIFT_PRESSED 0x36 +#define LEFT_SHIFT_RELEASED 0xAA +#define RIGHT_SHIFT_RELEASED 0xB6 + char keyboard_getchar(); #endif diff --git a/src/drivers/serial.c b/src/drivers/serial.c index 7b08c3f..a9d369f 100644 --- a/src/drivers/serial.c +++ b/src/drivers/serial.c @@ -1,3 +1,8 @@ +// Serial I/O driver +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #include "../kernel/io.h" #include "serial.h" #include "../libc/stdio.h" @@ -279,4 +284,3 @@ void serial_printf(int errlevel, const char* fmt, ...) } serial_puts("\n"); } - diff --git a/src/drivers/serial.h b/src/drivers/serial.h index 52cc4b4..bfa2cfd 100644 --- a/src/drivers/serial.h +++ b/src/drivers/serial.h @@ -1,5 +1,10 @@ -#ifndef INCLUDE_SERIAL_H -#define INCLUDE_SERIAL_H +// Serial I/O driver header +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + +#ifndef SERIAL_H +#define SERIAL_H #define PORT 0x3f8 //COM1 @@ -9,4 +14,5 @@ void write_serial(const char a); void serial_puts(const char* str); void log(const char* str, const int errlevel); void serial_printf(int errlevel, const char* fmt, ...); + #endif diff --git a/src/drivers/timer.c b/src/drivers/timer.c index acccb19..b3b36c1 100644 --- a/src/drivers/timer.c +++ b/src/drivers/timer.c @@ -1,3 +1,8 @@ +// Programmable Interval Timer channel 0 driver +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #include "../kernel/system.h" #include "../libc/stdio.h" diff --git a/src/kernel/gdt.c b/src/kernel/gdt.c index 4ba0952..e87a980 100644 --- a/src/kernel/gdt.c +++ b/src/kernel/gdt.c @@ -1,22 +1,11 @@ +// Global descriptor table setup +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #include "gdt.h" #include "../libc/stdio.h" -struct gdt_entry -{ - unsigned short limit_low; - unsigned short base_low; - unsigned char base_middle; - unsigned char access; - unsigned char granularity; - unsigned char base_high; -} __attribute__((packed)); - -struct gdt_ptr -{ - unsigned short limit; - unsigned int base; -} __attribute__((packed)); - struct gdt_entry gdt[3]; struct gdt_ptr gp; diff --git a/src/kernel/gdt.h b/src/kernel/gdt.h index 2607869..3f2f310 100644 --- a/src/kernel/gdt.h +++ b/src/kernel/gdt.h @@ -1,8 +1,28 @@ +// Global descriptor table setup header +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #ifndef GDT_H #define GDT_H -void gdt_set_gate(int num, unsigned long base, unsigned long limit, unsigned char access, unsigned char gran); +struct gdt_entry +{ + unsigned short limit_low; + unsigned short base_low; + unsigned char base_middle; + unsigned char access; + unsigned char granularity; + unsigned char base_high; +} __attribute__((packed)); +struct gdt_ptr +{ + unsigned short limit; + unsigned int base; +} __attribute__((packed)); + +void gdt_set_gate(int num, unsigned long base, unsigned long limit, unsigned char access, unsigned char gran); void gdt_install(); #endif diff --git a/src/kernel/idt.c b/src/kernel/idt.c index f892f03..f859ec4 100644 --- a/src/kernel/idt.c +++ b/src/kernel/idt.c @@ -1,22 +1,12 @@ +// Interrupt descriptor table setup +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #include "idt.h" #include "system.h" #include "../libc/stdio.h" -struct idt_entry -{ - unsigned short base_lo; - unsigned short sel; - unsigned char always0; - unsigned char flags; - unsigned short base_hi; -} __attribute__((packed)); - -struct idt_ptr -{ - unsigned short limit; - unsigned int base; -} __attribute__((packed)); - struct idt_entry idt[256]; struct idt_ptr idtp; diff --git a/src/kernel/idt.h b/src/kernel/idt.h index 2d28f8f..a4a85f6 100644 --- a/src/kernel/idt.h +++ b/src/kernel/idt.h @@ -1,8 +1,27 @@ +// Interrupt descriptor table setup header +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #ifndef IDT_H #define IDT_H -void idt_set_gate(unsigned char num, unsigned long base, unsigned short sel, unsigned char flags); +struct idt_entry +{ + unsigned short base_lo; + unsigned short sel; + unsigned char always0; + unsigned char flags; + unsigned short base_hi; +} __attribute__((packed)); +struct idt_ptr +{ + unsigned short limit; + unsigned int base; +} __attribute__((packed)); + +void idt_set_gate(unsigned char num, unsigned long base, unsigned short sel, unsigned char flags); void idt_install(); #endif diff --git a/src/kernel/io.h b/src/kernel/io.h index 6480303..518065d 100644 --- a/src/kernel/io.h +++ b/src/kernel/io.h @@ -1,7 +1,12 @@ -#ifndef INCLUDE_IO_H -#define INCLUDE_IO_H +// Raw CPU port I/O kernel module header +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos -#include "../libc/stdint.h" +#ifndef IO_H +#define IO_H + +#include void outb(unsigned short port, unsigned char data); unsigned char inb(unsigned short port); diff --git a/src/kernel/io.s b/src/kernel/io.s index b677e49..7ed8685 100644 --- a/src/kernel/io.s +++ b/src/kernel/io.s @@ -1,17 +1,22 @@ +; Raw CPU port I/O kernel module +; Author: xamidev +; Licensed under the Unlicense. See the repo below. +; https://github.com/xamidev/blankos + global outb outb: - mov al, [esp + 8] - mov dx, [esp + 4] - out dx, al - ret + mov al, [esp + 8] + mov dx, [esp + 4] + out dx, al + ret global inb inb: - mov dx, [esp + 4] - in al, dx - ret + mov dx, [esp + 4] + in al, dx + ret global x86_div64_32 diff --git a/src/kernel/irq.c b/src/kernel/irq.c index 89b9adc..05f6f6f 100644 --- a/src/kernel/irq.c +++ b/src/kernel/irq.c @@ -1,3 +1,8 @@ +// Interrupt Requests setup +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #include "system.h" #include "io.h" #include "idt.h" diff --git a/src/kernel/isr.c b/src/kernel/isr.c index fa17ce9..a692d9b 100644 --- a/src/kernel/isr.c +++ b/src/kernel/isr.c @@ -1,3 +1,8 @@ +// Interrupt service routines setup +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #include "system.h" #include "../libc/stdio.h" #include "idt.h" @@ -37,7 +42,6 @@ extern void isr31(); void isr_install() { - idt_set_gate(0, (unsigned)isr0, 0x08, 0x8E); idt_set_gate(1, (unsigned)isr1, 0x08, 0x8E); idt_set_gate(2, (unsigned)isr2, 0x08, 0x8E); @@ -116,4 +120,3 @@ void fault_handler(struct regs *r) for (;;); } } - diff --git a/src/kernel/kheap.c b/src/kernel/kheap.c index 439a081..091ac0c 100644 --- a/src/kernel/kheap.c +++ b/src/kernel/kheap.c @@ -1,6 +1,10 @@ -#include "kheap.h" +// Kernel heap management +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos -#include "../libc/stdint.h" +#include "kheap.h" +#include extern uint32_t end; uint32_t placement_address = (uint32_t)&end; diff --git a/src/kernel/kheap.h b/src/kernel/kheap.h index 7e16d91..1443b31 100644 --- a/src/kernel/kheap.h +++ b/src/kernel/kheap.h @@ -1,7 +1,12 @@ +// Kernel heap management header +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #ifndef KHEAP_H #define KHEAP_H -#include "../libc/stdint.h" +#include uint32_t kmalloc_a(uint32_t sz); uint32_t kmalloc_p(uint32_t sz, uint32_t *phys); diff --git a/src/kernel/kmain.c b/src/kernel/kmain.c index 5f1a11d..14248bc 100644 --- a/src/kernel/kmain.c +++ b/src/kernel/kmain.c @@ -1,3 +1,8 @@ +// Kernel entry point +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #include "../libc/stdio.h" #include "../drivers/serial.h" #include "gdt.h" @@ -5,43 +10,15 @@ #include "system.h" #include "paging.h" #include "../drivers/ata.h" -#include "../libc/stdint.h" +#include #include "../drivers/framebuffer.h" - -typedef struct { - uint32_t type; - uint32_t size; - uint64_t framebuffer_addr; - uint32_t framebuffer_pitch; - uint32_t framebuffer_width; - uint32_t framebuffer_height; - uint8_t framebuffer_bpp; - uint8_t framebuffer_type; - uint16_t reserved; -} multiboot2_tag_framebuffer; - -typedef struct { - uint32_t total_size; - uint32_t reserved; - uint8_t tags[0]; -} multiboot2_info; - -unsigned int g_multiboot_info_address; - -uint32_t* framebuffer; -int scanline; - -// in characters, not pixels -uint32_t VGA_WIDTH; -uint32_t VGA_HEIGHT; - +#include "kmain.h" void kmain(multiboot2_info *mb_info) { - multiboot2_tag_framebuffer *fb_info = NULL; -uint8_t *tags = mb_info->tags; + uint8_t *tags = mb_info->tags; while (1) { uint32_t tag_type = *((uint32_t*) tags); uint32_t tag_size = *((uint32_t*) (tags + 4)); @@ -54,61 +31,43 @@ uint8_t *tags = mb_info->tags; tags += ((tag_size + 7) & ~7); } - serial_printf(3, "Framebuffer Address: 0x%x\r", fb_info->framebuffer_addr); + serial_printf(3, "Framebuffer Address: 0x%x\r", fb_info->framebuffer_addr); serial_printf(3, "Framebuffer Width: %u\r\n", fb_info->framebuffer_width); serial_printf(3, "Framebuffer Height: %u\r\n", fb_info->framebuffer_height); serial_printf(3, "Framebuffer Pitch: %u\r\n", fb_info->framebuffer_pitch); serial_printf(3, "Framebuffer BPP: %u\r\n", fb_info->framebuffer_bpp); - if (fb_info) { framebuffer = (uint32_t *)(uintptr_t) fb_info->framebuffer_addr; uint32_t width = fb_info->framebuffer_width; uint32_t height = fb_info->framebuffer_height; - //uint32_t pitch = fb_info->framebuffer_pitch; uint32_t bpp = fb_info->framebuffer_bpp; - - //8x16 font, not padded - VGA_WIDTH = width/8; - VGA_HEIGHT = height/16; - - scanline = width * (bpp/8); - - - /* TEST print charset - int y_offset = 2; - for (int i=0; i<512; i++) - { - if (i%(width/9)==0) y_offset++; - draw_char(0+i, 0+i, y_offset, white, black); - } - */ + //8x16 font, not padded + VGA_WIDTH = width/8; + VGA_HEIGHT = height/16; + scanline = width * (bpp/8); } printf("[kernel] multiboot2 info at 0x%x, size=%u\n", mb_info, mb_info->total_size); printf("[kernel] framebuffer discovered at 0x%x\n", fb_info->framebuffer_addr); printf("[kernel] fb0: width=%u, height=%u, pitch=%u, bpp=%u\n", fb_info->framebuffer_width, fb_info->framebuffer_height, fb_info->framebuffer_pitch, fb_info->framebuffer_bpp); - - init_serial(); - gdt_install(); - idt_install(); - isr_install(); - irq_install(); - __asm__ __volatile__("sti"); + init_serial(); + gdt_install(); + idt_install(); + isr_install(); + irq_install(); + __asm__ __volatile__("sti"); - //init_paging(); + //init_paging(); + //test_read_sector(); + //uint32_t *ptr = (uint32_t*)0xA0000000; + //uint32_t do_page_fault = *ptr; - //test_read_sector(); - - //uint32_t *ptr = (uint32_t*)0xA0000000; - //uint32_t do_page_fault = *ptr; - - timer_install(); - keyboard_install(); - printf("[kernel] spawning shell...\n"); - shell_install(); - + timer_install(); + keyboard_install(); + printf("[kernel] spawning shell...\n"); + shell_install(); } diff --git a/src/kernel/kmain.h b/src/kernel/kmain.h new file mode 100644 index 0000000..7c7ce2d --- /dev/null +++ b/src/kernel/kmain.h @@ -0,0 +1,36 @@ +// Kernel entry point header +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + +#ifndef KMAIN_H +#define KMAIN_H + +typedef struct { + uint32_t type; + uint32_t size; + uint64_t framebuffer_addr; + uint32_t framebuffer_pitch; + uint32_t framebuffer_width; + uint32_t framebuffer_height; + uint8_t framebuffer_bpp; + uint8_t framebuffer_type; + uint16_t reserved; +} multiboot2_tag_framebuffer; + +typedef struct { + uint32_t total_size; + uint32_t reserved; + uint8_t tags[0]; +} multiboot2_info; + +unsigned int g_multiboot_info_address; + +uint32_t* framebuffer; +int scanline; + +// in characters, not pixels +uint32_t VGA_WIDTH; +uint32_t VGA_HEIGHT; + +#endif \ No newline at end of file diff --git a/src/kernel/loader.s b/src/kernel/loader.s index 36410ac..aa53c33 100644 --- a/src/kernel/loader.s +++ b/src/kernel/loader.s @@ -1,3 +1,8 @@ +; Kernel loader assembly stub and multiboot2 header +; Author: xamidev +; Licensed under the Unlicense. See the repo below. +; https://github.com/xamidev/blankos + global loader section .multiboot_header @@ -6,9 +11,9 @@ align 8 ; ASM macros -MAGIC_NUMBER equ 0xe85250d6 ; multiboot2 magic -FLAGS equ 0x0 ; 32-bit protected mode for i386 -HEADER_LEN equ 44 ; Tags=2+2+4+4+4+4+2+2+4=28 +MAGIC_NUMBER equ 0xe85250d6 ; multiboot2 magic +FLAGS equ 0x0 ; 32-bit protected mode for i386 +HEADER_LEN equ 44 ; Tags=2+2+4+4+4+4+2+2+4=28 CHECKSUM equ -(MAGIC_NUMBER + FLAGS + HEADER_LEN) ; Multiboot 2 header, according to specification (16bytes) @@ -43,14 +48,12 @@ KERNEL_STACK_SIZE equ 4096 extern kmain loader: - cli - ; mov eax, 0xCAFEBABE - ; push dword 42 - push ebx - call kmain + cli + push ebx + call kmain .loop: - jmp .loop + jmp .loop global gdt_flush extern gp @@ -206,5 +209,5 @@ irq_common_stub: section .bss align 4 kernel_stack: - resb KERNEL_STACK_SIZE - mov esp, kernel_stack + KERNEL_STACK_SIZE + resb KERNEL_STACK_SIZE + mov esp, kernel_stack + KERNEL_STACK_SIZE diff --git a/src/kernel/paging.c b/src/kernel/paging.c index c49efa4..daa964a 100644 --- a/src/kernel/paging.c +++ b/src/kernel/paging.c @@ -1,18 +1,19 @@ -#include "../libc/stdint.h" +// Paging kernel module +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + +#include #include "paging.h" #include "../libc/stdio.h" #include "system.h" #include "kheap.h" - uint32_t *frames; uint32_t nframes; extern uint32_t placement_address; -#define INDEX_FROM_BIT(a) (a/(8*4)) -#define OFFSET_FROM_BIT(a) (a%(8*4)) - static void set_frame(uint32_t frame_addr) { uint32_t frame = frame_addr/0x1000; diff --git a/src/kernel/paging.h b/src/kernel/paging.h index ee485ad..fa7f063 100644 --- a/src/kernel/paging.h +++ b/src/kernel/paging.h @@ -1,12 +1,21 @@ +// Paging kernel module header +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #ifndef PAGING_H #define PAGING_H #include "system.h" -#include "../libc/stdint.h" +#include + +#define INDEX_FROM_BIT(a) (a/(8*4)) +#define OFFSET_FROM_BIT(a) (a%(8*4)) + typedef struct { uint32_t present : 1; - uint32_t rw : 1; + uint32_t rw : 1; uint32_t user : 1; uint32_t accessed : 1; uint32_t dirty : 1; diff --git a/src/kernel/shell.c b/src/kernel/shell.c index fe3973e..28b8c2c 100644 --- a/src/kernel/shell.c +++ b/src/kernel/shell.c @@ -1,13 +1,17 @@ +// Basic shell and commands kernel module +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #include "system.h" #include "../libc/stdio.h" #include "../libc/string.h" #include "../programs/programs.h" -#include "../libc/stdint.h" +#include #define BUFFER_SIZE 256 #define MAX_COMMANDS 16 -#define MAX_ARGS 64 - +#define MAX_ARGS 64 char* ascii_title = "\n" @@ -17,7 +21,6 @@ char* ascii_title = "----------------------------------------------\n" "\n"; - typedef void (*command_func_t)(int argc, char *argv[]); typedef struct diff --git a/src/kernel/sysinfo.c b/src/kernel/sysinfo.c index b5b7bbe..088f41d 100644 --- a/src/kernel/sysinfo.c +++ b/src/kernel/sysinfo.c @@ -1,3 +1,8 @@ +// System information kernel module +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #include "../libc/stdio.h" #include "../libc/string.h" diff --git a/src/kernel/sysinfo.h b/src/kernel/sysinfo.h index 66188ca..d05a265 100644 --- a/src/kernel/sysinfo.h +++ b/src/kernel/sysinfo.h @@ -1,3 +1,8 @@ +// System information kernel module header +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #ifndef SYSINFO_H #define SYSINFO_H diff --git a/src/kernel/system.c b/src/kernel/system.c index 36594da..c2766f5 100644 --- a/src/kernel/system.c +++ b/src/kernel/system.c @@ -1,5 +1,10 @@ +// System utilities and routines kernel module +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #include "system.h" -#include "../libc/stdint.h" +#include void *memset(void *dest, char val, size_t count) { diff --git a/src/kernel/system.h b/src/kernel/system.h index 874cf19..66416f5 100644 --- a/src/kernel/system.h +++ b/src/kernel/system.h @@ -1,9 +1,15 @@ +// System utilities and routines kernel module header +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #ifndef SYSTEM_H #define SYSTEM_H -#include "../libc/stdint.h" +#include typedef int size_t; +#define NULL ((void*)0) void *memset(void *dest, char val, size_t count); void *memmove(void* dest, const void* src, size_t n); diff --git a/src/libc/crypto.c b/src/libc/crypto.c index b9c261e..ba2a48e 100644 --- a/src/libc/crypto.c +++ b/src/libc/crypto.c @@ -1,5 +1,10 @@ +// Cryptography routines for blankos/libc +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #include "crypto.h" -#include "../libc/stdint.h" +#include int lcg(int seed) { diff --git a/src/libc/crypto.h b/src/libc/crypto.h index 04a54b1..fddbbc9 100644 --- a/src/libc/crypto.h +++ b/src/libc/crypto.h @@ -1,9 +1,14 @@ +// Cryptography routines for blankos/libc header +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #ifndef CRYPTO_H #define CRYPTO_H #define RAND_MAX 1024 -#include "../libc/stdint.h" +#include int lcg(int seed); int randint(int seed); diff --git a/src/libc/ctype.c b/src/libc/ctype.c index 49e4545..abf9ce4 100644 --- a/src/libc/ctype.c +++ b/src/libc/ctype.c @@ -1,12 +1,16 @@ +// Ctype implementation for blankos/libc +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos -#include "stdint.h" +#include +#include bool isdigit(char c) { return c >= '0' && c <= '9'; } - bool isspace(char c) { return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; diff --git a/src/libc/ctype.h b/src/libc/ctype.h index 10ace98..810e4fb 100644 --- a/src/libc/ctype.h +++ b/src/libc/ctype.h @@ -1,7 +1,12 @@ +// Ctype implementation for blankos/libc header +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #ifndef CTYPE_H #define CTYPE_H -#include "stdint.h" +#include bool isdigit(char c); bool isspace(char c); diff --git a/src/libc/stdint.h b/src/libc/stdint.h deleted file mode 100644 index fffbd7d..0000000 --- a/src/libc/stdint.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef INCLUDE_STDINT_H -#define INCLUDE_STDINT_H - -typedef signed char int8_t; -typedef unsigned char uint8_t; - -typedef signed short int16_t; -typedef unsigned short uint16_t; - -typedef signed long int int32_t; -typedef unsigned long int uint32_t; - -typedef signed long long int int64_t; -typedef unsigned long long int uint64_t; - -typedef uint8_t bool; -#define true 1 -#define false 0 - -#define NULL ((void*)0) - -typedef unsigned int uintptr_t; - -#endif diff --git a/src/libc/stdio.c b/src/libc/stdio.c index 3ea1076..3d7edb3 100644 --- a/src/libc/stdio.c +++ b/src/libc/stdio.c @@ -1,7 +1,12 @@ +// Standard input/output implementation for blankos/libc +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #include "../kernel/io.h" #include "stdio.h" #include "string.h" -#include "stdint.h" +#include #include "../kernel/system.h" #include "../drivers/framebuffer.h" #include "../drivers/serial.h" @@ -10,9 +15,6 @@ extern uint32_t* framebuffer; extern uint32_t VGA_WIDTH; extern uint32_t VGA_HEIGHT; unsigned int VGA_X = 0, VGA_Y = 0; - -#define CURSOR_WIDTH 8 -#define CURSOR_HEIGHT 16 extern int scanline; void draw_cursor(uint32_t color) diff --git a/src/libc/stdio.h b/src/libc/stdio.h index 731eb87..84dac49 100644 --- a/src/libc/stdio.h +++ b/src/libc/stdio.h @@ -1,16 +1,24 @@ -#ifndef INCLUDE_STDIO_H -#define INCLUDE_STDIO_H +// Standard input/output implementation for blankos/libc header +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos -#include "stdint.h" +#ifndef STDIO_H +#define STDIO_H -#define FB_GREEN 2 -#define FB_DARK_GREY 8 +#include +#include + +#define FB_GREEN 2 +#define FB_DARK_GREY 8 #define FB_CMD_PORT 0x3D4 #define FB_DATA_PORT 0x3D5 #define FB_HIGH_BYTE_CMD 14 #define FB_LOW_BYTE_CMD 15 +#define CURSOR_WIDTH 8 +#define CURSOR_HEIGHT 16 void draw_cursor(uint32_t color); void erase_cursor(); @@ -26,24 +34,23 @@ unsigned int getcolor(int x, int y); void putc(char c); void colorputc(char c, uint32_t fg, uint32_t bg); -#define PRINTF_STATE_START 0 +#define PRINTF_STATE_START 0 #define PRINTF_STATE_LENGTH 1 -#define PRINTF_STATE_SHORT 2 -#define PRINTF_STATE_LONG 3 -#define PRINTF_STATE_SPEC 4 -#define PRINTF_STATE_WIDTH 5 +#define PRINTF_STATE_SHORT 2 +#define PRINTF_STATE_LONG 3 +#define PRINTF_STATE_SPEC 4 +#define PRINTF_STATE_WIDTH 5 #define PRINTF_LENGTH_START 0 #define PRINTF_LENGTH_SHORT_SHORT 1 #define PRINTF_LENGTH_SHORT 2 -#define PRINTF_LENGTH_LONG 3 +#define PRINTF_LENGTH_LONG 3 #define PRINTF_LENGTH_LONG_LONG 4 void printf(const char* fmt, ...); int* printf_number(int* argp, int length, bool sign, int radix, int width, char pad_char); int getch(); void get_input(char *buffer, int size); - void dtostrf(double val, char *buffer, int precision); enum Colors diff --git a/src/libc/string.c b/src/libc/string.c index 5c79755..681298d 100644 --- a/src/libc/string.c +++ b/src/libc/string.c @@ -1,4 +1,10 @@ -#include "stdint.h" +// String operations implementation for blankos/libc +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + +#include +#include "../kernel/system.h" int strlen(const char* str) { diff --git a/src/libc/string.h b/src/libc/string.h index 384507e..b3fc1ce 100644 --- a/src/libc/string.h +++ b/src/libc/string.h @@ -1,5 +1,10 @@ -#ifndef INCLUDE_STRING_H -#define INCLUDE_STRING_H +// String operations implementation for blankos/libc header +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + +#ifndef STRING_H +#define STRING_H int strlen(const char* str); int strcmp(const char* str1, const char* str2); diff --git a/src/programs/bf.c b/src/programs/bf.c index 33bcb03..da330c7 100644 --- a/src/programs/bf.c +++ b/src/programs/bf.c @@ -1,3 +1,7 @@ +// Simple brainfuck interpreter program +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos #include "../kernel/system.h" #include "../libc/stdio.h" diff --git a/src/programs/ciphers.c b/src/programs/ciphers.c index 9193989..4d9a324 100644 --- a/src/programs/ciphers.c +++ b/src/programs/ciphers.c @@ -1,5 +1,12 @@ +// Cipher programs +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #include "../libc/stdio.h" #include "ciphers.h" +#include "../libc/string.h" +#include void rot13(char* input, char* output) { @@ -32,9 +39,6 @@ void program_rot13() printf("\n%s\n", output); } -#include "../libc/string.h" -#include "../libc/stdint.h" - const char* morse_alphabet[] = { ".-", // A "-...", // B diff --git a/src/programs/ciphers.h b/src/programs/ciphers.h index 7a015a3..59a3d94 100644 --- a/src/programs/ciphers.h +++ b/src/programs/ciphers.h @@ -1,3 +1,8 @@ +// Cipher programs header +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #ifndef CIPHERS_H #define CIPHERS_H diff --git a/src/programs/conway.c b/src/programs/conway.c index 93de491..61e4c4a 100644 --- a/src/programs/conway.c +++ b/src/programs/conway.c @@ -1,8 +1,13 @@ +// Conway's Game of Life program +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #include "conway.h" #include "../libc/stdio.h" #include "../kernel/system.h" #include "../libc/crypto.h" -#include "../libc/stdint.h" +#include #include "../drivers/serial.h" #include "../libc/string.h" diff --git a/src/programs/conway.h b/src/programs/conway.h index 77d3db2..e2f25ff 100644 --- a/src/programs/conway.h +++ b/src/programs/conway.h @@ -1,3 +1,8 @@ +// Conway's Game of Life program header +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #ifndef CONWAY_H #define CONWAY_H diff --git a/src/programs/math.c b/src/programs/math.c index 9f96c9e..3acd2b1 100644 --- a/src/programs/math.c +++ b/src/programs/math.c @@ -1,6 +1,9 @@ -// Math expression lexer and parser +// Basic math expression lexer and parser program +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos -#include "../libc/stdint.h" +#include #include "../kernel/system.h" #include "../libc/stdio.h" #include "../libc/ctype.h" diff --git a/src/programs/misc.c b/src/programs/misc.c index 32b24c1..bcf6729 100644 --- a/src/programs/misc.c +++ b/src/programs/misc.c @@ -1,4 +1,7 @@ // Miscellaneous small programs +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos #include "../libc/stdio.h" #include "../kernel/system.h" @@ -30,7 +33,7 @@ void program_rainbow() void program_clear() { - for (int i=0; i #include "../libc/stdio.h" #include "../kernel/system.h" diff --git a/src/programs/programs.h b/src/programs/programs.h index f3895e9..1dbf1b3 100644 --- a/src/programs/programs.h +++ b/src/programs/programs.h @@ -1,3 +1,8 @@ +// Global program entry points header +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + #ifndef PROGRAMS_H #define PROGRAMS_H @@ -22,4 +27,5 @@ void program_uptime(); void program_panic(); void program_help(); void program_echo(); + #endif diff --git a/src/programs/sysinfo.c b/src/programs/sysinfo.c index 778b67f..cd37a36 100644 --- a/src/programs/sysinfo.c +++ b/src/programs/sysinfo.c @@ -1,3 +1,7 @@ +// System information program +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos #include "../kernel/sysinfo.h" #include "../libc/stdio.h" diff --git a/src/programs/words.c b/src/programs/words.c index 129f1e6..9128f05 100644 --- a/src/programs/words.c +++ b/src/programs/words.c @@ -1,3 +1,7 @@ +// Pseudo-random word generation program +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos #include "../libc/stdio.h" #include "../libc/crypto.h" @@ -37,7 +41,7 @@ char* words[] = int words_size = sizeof(words)/sizeof(words[0]); -// Generates 5 random words +// Generates random words void program_words() { for (int i=0; i<10; i++)