diff --git a/Makefile b/Makefile index 098565f..28c65a3 100644 --- a/Makefile +++ b/Makefile @@ -1,23 +1,21 @@ all: build/kernel-i386.elf clean: - -@rm build/*.o build/*.elf 2> /dev/null || true + -@rm build/* 2> /dev/null || true -build/start32.o: build/ src/start32.asm - nasm -felf32 src/start32.asm -o build/start32.o -build/kernel-i386.elf: build/start32.o - tcc -m32 -nostdlib -Wl,-Ttext,0x100000 -o build/kernel-i386.elf src/*.c build/start32.o +build/kernel-i386.elf: src/* + tcc -m32 -nostdlib -Wl,-Ttext,0x100000 -o build/kernel-i386.elf src/start32.s src/*.c image: build/kernel-i386.elf mount - cp build/kernel-i386.elf mnt/ + cp build/kernel-i386.elf mnt/roska/start32.elf sync qemu-multiboot: build/kernel-i386.elf qemu-system-i386 -kernel build/kernel-i386.elf -serial stdio qemu-image: image - qemu-system-i386 koalemos.img -serial stdio + qemu-system-i386 roska.img -serial stdio -mount: koalemos.img mnt/ +mount: roska.img mnt/ @if ! mountpoint -q "mnt/"; then \ - sudo mount -o loop,offset=1048576,umask=177,dmask=022,uid=$(shell id -u),gid=$(shell id -g) koalemos.img mnt/; \ + sudo mount -o loop,offset=1048576,umask=177,dmask=022,uid=$(shell id -u),gid=$(shell id -g) roska.img mnt/; \ fi; umount: @sudo umount mnt diff --git a/README.md b/README.md index b6df57b..95b53e8 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ -# KoalemOS +# rOSka Multiboot compatible stupid useless OS-like project. ## Compatibility -32bit x86 legacy BIOS system +- x86 system with MultiBoot compatible bootloader. +- Linear framebuffer graphics ## Building -NASM and TinyCCompiler are used. +TinyCCompiler is used, even for assembly lol. TCC might need manual compilation for 32bit crosscompilation on 64bit systems. Just download the source and `make cross` or something. diff --git a/src/kernel.c b/src/kernel.c index 60d6c3a..223d37f 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1,3 +1,4 @@ + #include "multiboot.h" #include "framebuffer.h" #include "serial.h" @@ -19,7 +20,7 @@ void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo) { outb(0x3D5, 0x20); int serial_initialized = serial_init(); - serial_write_string("\n=== KoalemOS ===\n"); + serial_write_string("\n=== rOSka ===\n"); // Check multiboot header if (mbootmagick != MULTIBOOT_BOOTLOADER_MAGIC) { @@ -73,11 +74,11 @@ void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo) { for(;;) { for(y=0; y < mbootinfo->framebuffer_height; y++) { for(x=0; x < mbootinfo->framebuffer_width; x++) { - putpixel(x, y, c, c, c, 0xff); + putpixel(x, y, 0, c, c, 0xff); } } c+=4; } - serial_write_string("\nExecution finished, halting..."); + serial_write_string("\nExecution finished, halting...\n"); } diff --git a/src/serial.c b/src/serial.c index a9747cf..e4e8e27 100644 --- a/src/serial.c +++ b/src/serial.c @@ -20,30 +20,31 @@ int serial_init() { outb(PORT + 4, 0x0B); // IRQs enabled, RTS/DSR set outb(PORT + 4, 0x1E); // Set in loopback mode, test the serial chip outb(PORT + 0, 0xAE); // Test serial chip (send byte 0xAE and check if serial - // returns same byte) + // returns same byte) - // Check if serial is faulty (i.e: not same byte as sent) - if (inb(PORT + 0) != 0xAE) { - return 1; - } - - // If serial is not faulty set it in normal operation mode - // (not-loopback with IRQs enabled and OUT#1 and OUT#2 bits enabled) - outb(PORT + 4, 0x0F); - return 0; + // Check if serial is faulty (i.e: not same byte as sent) + if (inb(PORT + 0) != 0xAE) { + return 1; } - static int serial_is_transmit_empty() { return inb(PORT + 5) & 0x20; } - static void serial_write_char(char chr) { - while (serial_is_transmit_empty() == 0); - outb(PORT, chr); - } - - void serial_write_string(const char* text) { - int i = 0; - while(text[i]) { - serial_write_char(text[i]); - i++; - } + // If serial is not faulty set it in normal operation mode + // (not-loopback with IRQs enabled and OUT#1 and OUT#2 bits enabled) + outb(PORT + 4, 0x0F); + return 0; +} +static int serial_is_transmit_empty() { return inb(PORT + 5) & 0x20; } + +static void serial_write_char(char chr) { + while (serial_is_transmit_empty() == 0); + outb(PORT, chr); +} + +void serial_write_string(const char* text) { + int i = 0; + while(text[i]) { + serial_write_char(text[i]); + i++; } + +} diff --git a/src/start32.asm b/src/start32.asm deleted file mode 100644 index d4e7471..0000000 --- a/src/start32.asm +++ /dev/null @@ -1,47 +0,0 @@ -MULTIBOOT_HEADER_MAGIC equ 0x1BADB002 -MULTIBOOT_PAGE_ALIGN equ 1 << 0 -MULTIBOOT_MEMORY_INFO equ 1 << 1 -MULTIBOOT_VIDEO_REQUEST equ 0 << 2 -MULTIBOOT_AOUT_KLUDGE equ 0 << 16 -MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_VIDEO_REQUEST -MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_VIDEO_REQUEST | MULTIBOOT_AOUT_KLUDGE -MULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) - -section .multiboot -align 4 - dd MULTIBOOT_HEADER_MAGIC - dd MULTIBOOT_HEADER_FLAGS - dd MULTIBOOT_CHECKSUM - dd 0 ; header address - dd 0 ; load address - dd 0 ; load end address - dd 0 ; bss end address - dd 0 ; entry address - dd 0 ; video mode_type (0:fb, 1:txt) (set flags[2]!) - dd 1024 ; video width - dd 768 ; video height - dd 32 ; video depth - -section .bss -align 16 - stack_bottom: - resb 16384 - stack_top: - -section .text - global _start - extern kmain - -_start: - ; Setup stack - mov esp, stack_top - - ; Call the main kernel function. - push ebx - push eax - call kmain - -.hang: - cli - hlt - jmp .hang diff --git a/src/start32.s b/src/start32.s new file mode 100644 index 0000000..da0207a --- /dev/null +++ b/src/start32.s @@ -0,0 +1,49 @@ +.set MULTIBOOT_PAGE_ALIGN, 1 << 0 +.set MULTIBOOT_MEMORY_INFO, 1 << 1 +.set MULTIBOOT_VIDEO_REQUEST, 1 << 2 +.set MULTIBOOT_AOUT_KLUDGE, 0 << 16 +.set MULTIBOOT_HEADER_MAGIC, 0x1BADB002 +.set MULTIBOOT_HEADER_FLAGS, \ + MULTIBOOT_PAGE_ALIGN |\ + MULTIBOOT_MEMORY_INFO |\ + MULTIBOOT_VIDEO_REQUEST |\ + MULTIBOOT_AOUT_KLUDGE +.set MULTIBOOT_CHECKSUM, -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) + +#.section ".multiboottbabeee" +.align 4 + .long MULTIBOOT_HEADER_MAGIC + .long MULTIBOOT_HEADER_FLAGS + .long MULTIBOOT_CHECKSUM + .long 0 # header address + .long 0 # load address + .long 0 # load end address + .long 0 # bss end address + .long 0 # entry address + .long 0 # video mode_type (0:fb, 1:txt) (set flags[2]!) + .long 1024 # video width + .long 768 # video height + .long 32 # video depth + +.bss +.align 16 + stack_bottom: + .skip 16384 # 16k + stack_top: + +.text +.global _start +_start: + # Setup stack + mov $stack_top, %esp + + # Call the main kernel function. + push %ebx + push %eax + call kmain + + + cli +1: hlt + jmp 1b +#include "lol.s"