--- /dev/null
+{
+ "configurations": [
+ {
+ "name": "OS-DEV",
+ "includePath": [
+ "${workspaceFolder}/includes/**"
+ ],
+ "compilerArgs": [
+ "-ffreestanding"
+ ],
+ "defines": [],
+ "compilerPath": "${HOME}/opt/cross-compiler/bin/i686-elf-gcc",
+ "cStandard": "gnu99",
+ "intelliSenseMode": "gcc-x86"
+ }
+ ],
+ "version": 4
+}
\ No newline at end of file
--- /dev/null
+menuentry "$_OS_NAME" {
+ multiboot /boot/$_OS_NAME.bin
+}
\ No newline at end of file
stack_top:
.section .text
+ .global start_
+ .type start_, @function
start_:
movl $stack_top, %esp
/*
--- /dev/null
+ata0-master: type=cdrom, path="build/lunaix.iso", status=inserted
+
+boot: cdrom
\ No newline at end of file
--- /dev/null
+menuentry "lunaix" { multiboot /boot/lunaix.bin }
--- /dev/null
+#!/usr/bin/bash
+
+export _OS_NAME=$1
+
+echo $(cat GRUB_TEMPLATE | envsubst)
\ No newline at end of file
--- /dev/null
+typedef unsigned short vga_atrributes;
+
+#define VGA_COLOR_BLACK 0
+#define VGA_COLOR_BLUE 1
+#define VGA_COLOR_GREEN 2
+#define VGA_COLOR_CYAN 3
+#define VGA_COLOR_RED 4
+#define VGA_COLOR_MAGENTA 5
+#define VGA_COLOR_BROWN 6
+#define VGA_COLOR_LIGHT_GREY 7
+#define VGA_COLOR_DARK_GREY 8
+#define VGA_COLOR_LIGHT_BLUE 9
+#define VGA_COLOR_LIGHT_GREEN 10
+#define VGA_COLOR_LIGHT_CYAN 11
+#define VGA_COLOR_LIGHT_RED 12
+#define VGA_COLOR_LIGHT_MAGENTA 13
+#define VGA_COLOR_LIGHT_BROWN 14
+#define VGA_COLOR_WHITE 15
+
+void tty_set_theme(vga_atrributes fg, vga_atrributes bg);
+void tty_put_char(char chr);
+void tty_put_str(char* str);
+void tty_scroll_up();
+void tty_clear();
\ No newline at end of file
--- /dev/null
+#include <lunaix/tty/tty.h>
+
+void _kernel_init() {
+ // TODO
+}
+
+void _kernel_main(void* info_table) {
+ // TODO
+ tty_set_theme(VGA_COLOR_GREEN, VGA_COLOR_BLACK);
+ tty_put_str("Hello kernel world!\nThis is second line.");
+}
\ No newline at end of file
--- /dev/null
+#include <lunaix/tty/tty.h>
+#include <stdint.h>
+
+#define TTY_WIDTH 80
+#define TTY_HEIGHT 25
+
+vga_atrributes *buffer = 0xB8000;
+
+vga_atrributes theme_color = VGA_COLOR_BLACK;
+
+uint32_t TTY_COLUMN = 0;
+uint16_t TTY_ROW = 0;
+
+void tty_set_theme(vga_atrributes fg, vga_atrributes bg) {
+ theme_color = (bg << 4 | fg) << 8;
+}
+
+void tty_put_char(char chr) {
+ if (chr == '\n') {
+ TTY_COLUMN = 0;
+ TTY_ROW++;
+ }
+ else if (chr == '\r') {
+ TTY_COLUMN = 0;
+ }
+ else {
+ *(buffer + TTY_COLUMN + TTY_ROW * TTY_WIDTH) = (theme_color | chr);
+ TTY_COLUMN++;
+ if (TTY_COLUMN >= TTY_WIDTH) {
+ TTY_COLUMN = 0;
+ TTY_ROW++;
+ }
+ }
+
+ if (TTY_ROW >= TTY_HEIGHT) {
+ tty_scroll_up();
+ TTY_ROW--;
+ }
+}
+
+void tty_put_str(char* str) {
+ while (*str != '\0') {
+ tty_put_char(*str);
+ str++;
+ }
+}
+
+void tty_scroll_up() {
+ // TODO use memcpy
+}
+
+void tty_clear() {
+ for (uint32_t x = 0; x < TTY_WIDTH; x++) {
+ for (uint32_t y = 0; y < TTY_HEIGHT; y++) {
+ *(buffer + x + y * TTY_WIDTH) = theme_color;
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+ENTRY(start_)
+
+SECTIONS {
+ . = 0x100000;
+
+ .text BLOCK(4K) : {
+ * (.multiboot)
+ * (.text)
+ }
+
+ .bss BLOCK(4K) : {
+ * (COMMON)
+ * (.bss)
+ }
+
+ .data BLOCK(4k) : {
+ * (.data)
+ }
+
+ .rodata BLOCK(4K) : {
+ * (.rodata)
+ }
+}
\ No newline at end of file
--- /dev/null
+OS_ARCH := x86
+
+BUILD_DIR := build
+KERNEL_DIR := kernel
+OBJECT_DIR := $(BUILD_DIR)/obj
+BIN_DIR := $(BUILD_DIR)/bin
+ISO_DIR := $(BUILD_DIR)/iso
+ISO_BOOT_DIR := $(ISO_DIR)/boot
+ISO_GRUB_DIR := $(ISO_BOOT_DIR)/grub
+
+INCLUDES_DIR := includes
+INCLUDES := $(patsubst %, -I%, $(INCLUDES_DIR))
+
+OS_NAME = lunaix
+OS_BIN = $(OS_NAME).bin
+OS_ISO = $(OS_NAME).iso
+
+CC := i686-elf-gcc
+AS := i686-elf-as
+
+O := -O3
+W := -Wall -Wextra
+CFLAGS := -std=gnu99 -ffreestanding $(O) $(W)
+LDFLAGS := -ffreestanding $(O) -nostdlib -lgcc
+
+SOURCE_FILES := $(shell find -name "*.[cS]")
+SRC := $(patsubst ./%, $(OBJECT_DIR)/%.o, $(SOURCE_FILES))
+
+$(OBJECT_DIR):
+ @mkdir -p $(OBJECT_DIR)
+
+$(BIN_DIR):
+ @mkdir -p $(BIN_DIR)
+
+$(ISO_DIR):
+ @mkdir -p $(ISO_DIR)
+ @mkdir -p $(ISO_BOOT_DIR)
+ @mkdir -p $(ISO_GRUB_DIR)
+
+$(OBJECT_DIR)/%.S.o: %.S
+ @mkdir -p $(@D)
+ $(CC) -c $< -o $@
+
+$(OBJECT_DIR)/%.c.o: %.c
+ @mkdir -p $(@D)
+ $(CC) $(INCLUDES) -c $< -o $@ $(CFLAGS)
+
+$(BIN_DIR)/$(OS_BIN): $(OBJECT_DIR) $(BIN_DIR) $(SRC)
+ $(CC) -T linker.ld -o $(BIN_DIR)/$(OS_BIN) $(SRC) $(LDFLAGS)
+
+$(BUILD_DIR)/$(OS_ISO): $(ISO_DIR) $(BIN_DIR)/$(OS_BIN) GRUB_TEMPLATE
+ @./config-grub.sh ${OS_NAME} > $(ISO_GRUB_DIR)/grub.cfg
+ @cp $(BIN_DIR)/$(OS_BIN) $(ISO_BOOT_DIR)
+ @grub-mkrescue -o $(BUILD_DIR)/$(OS_ISO) $(ISO_DIR)
+
+all: clean $(BUILD_DIR)/$(OS_ISO)
+
+all-debug: O := -O0
+all-debug: CFLAGS := -g -std=gnu99 -ffreestanding $(O) $(W) -fomit-frame-pointer
+all-debug: LDFLAGS := -ffreestanding $(O) -nostdlib -lgcc
+all-debug: clean $(BUILD_DIR)/$(OS_ISO)
+ @i686-elf-objdump -D $(BIN_DIR)/$(OS_BIN) > dump
+
+clean:
+ @rm -rf $(BUILD_DIR)
+
+run: $(BUILD_DIR)/$(OS_ISO)
+ @qemu-system-i386 -cdrom $(BUILD_DIR)/$(OS_ISO)
+
+debug-qemu: all-debug
+ @objcopy --only-keep-debug $(BIN_DIR)/$(OS_BIN) $(BUILD_DIR)/kernel.dbg
+ @qemu-system-i386 -s -S -kernel $(BIN_DIR)/$(OS_BIN) &
+ @gdb -s $(BUILD_DIR)/kernel.dbg -ex "target remote localhost:1234"
+
+debug-bochs: all-debug
+ @bochs -q -f bochs.cfg
\ No newline at end of file