réplica de
https://github.com/Arnau478/quark.git
synced 2024-11-23 12:58:07 +01:00
Finally, bootable kernel bare bones!
This commit is contained in:
pare
7fe708880d
commit
30070d84dd
S'han modificat 11 arxius amb 165 adicions i 21 eliminacions
15
Makefile
15
Makefile
|
@ -1,9 +1,16 @@
|
||||||
|
.PHONY: quark
|
||||||
|
quark: build-dir kernel
|
||||||
|
|
||||||
|
include config/.conf
|
||||||
include scripts/toolchain.mk
|
include scripts/toolchain.mk
|
||||||
|
include scripts/kernel.mk
|
||||||
BUILD_DIR?=build/
|
include scripts/run.mk
|
||||||
|
|
||||||
quark: build-dir $(BUILD_DIR)/quark
|
|
||||||
|
|
||||||
.PHONY: build-dir
|
.PHONY: build-dir
|
||||||
build-dir:
|
build-dir:
|
||||||
@mkdir -p $(BUILD_DIR)
|
@mkdir -p $(BUILD_DIR)
|
||||||
|
@echo -e $(ARROW) "Created build directory"
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
@rm -rf $(BUILD_DIR)/**
|
||||||
|
|
20
config/.conf
Normal file
20
config/.conf
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
# CONFIG #
|
||||||
|
|
||||||
|
BUILD_DIR ?= $(abspath build/)
|
||||||
|
|
||||||
|
TARGET = i686-elf
|
||||||
|
TARGET_ASM = nasm
|
||||||
|
TARGET_ASMFLAGS =
|
||||||
|
TARGET_CFLAGS = -std=c99 -g
|
||||||
|
TARGET_CC = $(TARGET)-gcc
|
||||||
|
TARGET_CXX = $(TARGET)-g++
|
||||||
|
TARGET_LD = $(TARGET)-gcc
|
||||||
|
TARGET_LINKFLAGS =
|
||||||
|
TARGET_LIBS =
|
||||||
|
|
||||||
|
BINUTILS_VERSION = 2.37
|
||||||
|
BINUTILS_URL = https://ftp.gnu.org/gnu/binutils/binutils-$(BINUTILS_VERSION).tar.xz
|
||||||
|
GCC_VERSION = 11.1.0
|
||||||
|
GCC_URL = https://ftp.gnu.org/gnu/gcc/gcc-$(GCC_VERSION)/gcc-$(GCC_VERSION).tar.gz
|
||||||
|
|
||||||
|
ARROW = "\x1b[32m-->\x1b[0m"
|
|
@ -1,15 +0,0 @@
|
||||||
# TOOLCHAIN CONFIGURATION FILE
|
|
||||||
|
|
||||||
export TARGET = i686-elf
|
|
||||||
export TARGET_ASM = nasm
|
|
||||||
export TARGET_ASMFLAGS =
|
|
||||||
export TARGET_CFLAGS = -std=c99 -g
|
|
||||||
export TARGET_CC = $(TARGET)-gcc
|
|
||||||
export TARGET_CXX = $(TARGET)-g++
|
|
||||||
export TARGET_LD = $(TARGET)-gcc
|
|
||||||
export TARGET_LINKFLAGS =
|
|
||||||
export TARGET_LIBS =
|
|
||||||
BINUTILS_VERSION = 2.37
|
|
||||||
BINUTILS_URL = https://ftp.gnu.org/gnu/binutils/binutils-$(BINUTILS_VERSION).tar.xz
|
|
||||||
GCC_VERSION = 11.1.0
|
|
||||||
GCC_URL = https://ftp.gnu.org/gnu/gcc/gcc-$(GCC_VERSION)/gcc-$(GCC_VERSION).tar.gz
|
|
25
scripts/kernel.ld
Normal file
25
scripts/kernel.ld
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
ENTRY(_start)
|
||||||
|
phys = 0x00100000;
|
||||||
|
|
||||||
|
SECTIONS{
|
||||||
|
.text phys : AT(phys){
|
||||||
|
code = .;
|
||||||
|
*(.text)
|
||||||
|
*(.rodata)
|
||||||
|
. = ALIGN(4096);
|
||||||
|
}
|
||||||
|
|
||||||
|
.data : AT(phys + (data - code)){
|
||||||
|
data = .;
|
||||||
|
*(.data)
|
||||||
|
. = ALIGN(4096);
|
||||||
|
}
|
||||||
|
|
||||||
|
.bss : AT(phys + (bss - code)){
|
||||||
|
bss = .;
|
||||||
|
*(.bss)
|
||||||
|
. = ALIGN(4096);
|
||||||
|
}
|
||||||
|
|
||||||
|
end = .;
|
||||||
|
}
|
23
scripts/kernel.mk
Normal file
23
scripts/kernel.mk
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
.PHONY: kernel
|
||||||
|
kernel: $(BUILD_DIR)/kernel.bin
|
||||||
|
|
||||||
|
HEADERS_C = $(shell find src/kernel -type f -name "*.h")
|
||||||
|
SOURCES_C = $(shell find src/kernel -type f -name "*.c")
|
||||||
|
OBJECTS_C = $(patsubst src/kernel/%.c, $(BUILD_DIR)/kernel/c/%.obj, $(SOURCES_C))
|
||||||
|
HEADERS_ASM = $(shell find src/kernel -type f -name "*.inc")
|
||||||
|
SOURCES_ASM = $(shell find src/kernel -type f -name "*.asm")
|
||||||
|
OBJECTS_ASM = $(patsubst src/kernel/%.asm, $(BUILD_DIR)/kernel/asm/%.obj, $(SOURCES_ASM))
|
||||||
|
|
||||||
|
$(BUILD_DIR)/kernel.bin: $(OBJECTS_ASM) $(OBJECTS_C)
|
||||||
|
@$(TARGET_LD) $(TARGET_LINKFLAGS) -T scripts/kernel.ld -nostdlib -Wl,-Map=$(BUILD_DIR)/kernel.map -o $@ $^ $(TARGET_LIBS) -lgcc
|
||||||
|
@echo -e $(ARROW) "Created $(basename $@)"
|
||||||
|
|
||||||
|
$(BUILD_DIR)/kernel/c/%.obj: src/kernel/%.c $(HEADERS_C)
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
@$(TARGET_CC) $(TARGET_CFLAGS) -ffreestanding -nostdlib -c -o $@ $<
|
||||||
|
@echo -e $(ARROW) "Compiled $<"
|
||||||
|
|
||||||
|
$(BUILD_DIR)/kernel/asm/%.obj: src/kernel/%.asm $(HEADERS_ASM)
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
@$(TARGET_ASM) $(TARGET_ASMFLAGS) -f elf -o $@ $<
|
||||||
|
@echo -e $(ARROW) "Assembled $<"
|
8
scripts/run.mk
Normal file
8
scripts/run.mk
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
.PHONY: run
|
||||||
|
run: quark run-qemu
|
||||||
|
|
||||||
|
.PHONY: run-qemu
|
||||||
|
run-qemu:
|
||||||
|
@echo -e $(ARROW) "Running on qemu..."
|
||||||
|
@qemu-system-i386 -kernel $(BUILD_DIR)/kernel.bin
|
||||||
|
@echo -e $(ARROW) "Finished run"
|
|
@ -1,5 +1,3 @@
|
||||||
include config/toolchain.conf
|
|
||||||
|
|
||||||
TOOLCHAIN_PREFIX = $(abspath toolchain/$(TARGET))
|
TOOLCHAIN_PREFIX = $(abspath toolchain/$(TARGET))
|
||||||
export PATH := $(TOOLCHAIN_PREFIX)/bin:$(PATH)
|
export PATH := $(TOOLCHAIN_PREFIX)/bin:$(PATH)
|
||||||
|
|
||||||
|
|
31
src/kernel/arch/i686/io.asm
Normal file
31
src/kernel/arch/i686/io.asm
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
global i686_inb
|
||||||
|
i686_inb:
|
||||||
|
[bits 32]
|
||||||
|
mov dx, [esp + 4]
|
||||||
|
xor eax, eax
|
||||||
|
in al, dx
|
||||||
|
ret
|
||||||
|
|
||||||
|
global i686_outb
|
||||||
|
i686_outb:
|
||||||
|
[bits 32]
|
||||||
|
mov dx, [esp + 4]
|
||||||
|
mov al, [esp + 8]
|
||||||
|
out dx, al
|
||||||
|
ret
|
||||||
|
|
||||||
|
global i686_inw
|
||||||
|
i686_inw:
|
||||||
|
[bits 32]
|
||||||
|
mov dx, [esp + 4]
|
||||||
|
xor eax, eax
|
||||||
|
in ax, dx
|
||||||
|
ret
|
||||||
|
|
||||||
|
global i686_outw
|
||||||
|
i686_outw:
|
||||||
|
[bits 32]
|
||||||
|
mov dx, [esp + 4]
|
||||||
|
mov ax, [esp + 8]
|
||||||
|
out dx, ax
|
||||||
|
ret
|
6
src/kernel/arch/i686/io.h
Normal file
6
src/kernel/arch/i686/io.h
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
uint8_t __attribute__((cdecl)) i686_inb(uint16_t port);
|
||||||
|
void __attribute__((cdecl)) i686_outb(uint16_t port, uint8_t value);
|
||||||
|
uint16_t __attribute__((cdecl)) i686_inw(uint16_t port);
|
||||||
|
void __attribute__((cdecl)) i686_outw(uint16_t port, uint16_t value);
|
34
src/kernel/entry.asm
Normal file
34
src/kernel/entry.asm
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
[bits 32]
|
||||||
|
extern kmain
|
||||||
|
extern i686_outw
|
||||||
|
global _start
|
||||||
|
|
||||||
|
_start:
|
||||||
|
mov esp, _sys_stack
|
||||||
|
jmp call_kmain
|
||||||
|
|
||||||
|
; Multiboot header
|
||||||
|
align 4
|
||||||
|
mboot:
|
||||||
|
; Some macros
|
||||||
|
MULTIBOOT_PAGE_ALIGN equ 1<<0
|
||||||
|
MULTIBOOT_MEMORY_INFO equ 1<<1
|
||||||
|
MULTIBOOT_HEADER_MAGIC equ 0x1BADB002
|
||||||
|
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO
|
||||||
|
MULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
|
||||||
|
|
||||||
|
; The actual header
|
||||||
|
dd MULTIBOOT_HEADER_MAGIC
|
||||||
|
dd MULTIBOOT_HEADER_FLAGS
|
||||||
|
dd MULTIBOOT_CHECKSUM
|
||||||
|
|
||||||
|
call_kmain:
|
||||||
|
call kmain
|
||||||
|
push 0x2000
|
||||||
|
push 0x604
|
||||||
|
call i686_outw
|
||||||
|
jmp $
|
||||||
|
|
||||||
|
section .bss
|
||||||
|
resb 8192 ; For the stack
|
||||||
|
_sys_stack:
|
7
src/kernel/main.c
Normal file
7
src/kernel/main.c
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "arch/i686/io.h"
|
||||||
|
|
||||||
|
void __attribute__((cdecl)) kmain(uint64_t magic, uint64_t addr){
|
||||||
|
char *mem = (char *)0xB8000; // Screen memory address (when on text mode)
|
||||||
|
for(int i = 0; 1; i++) mem[i] = 88; // Fill screen with Blue 'X' characters over pink background
|
||||||
|
}
|
Loading…
Referencia en una nova incidència