Barebones Kernel Commit

Uses limine to boot off of a disk.
Outputs a character to the debug port.
This commit is contained in:
Drew Galbraith 2023-05-17 20:20:53 -07:00
commit e9705f7579
8 changed files with 169 additions and 0 deletions

36
zion/CMakeLists.txt Normal file
View file

@ -0,0 +1,36 @@
add_executable(zion
zion.cpp)
# -c -- Don't run the linker.
# -nostdlib -- Don't include the standard library.
# -mabi=sysv -- Explicitly specify the ABI since we will rely on it.
# -mno-red-zone -- Don't put data below the stack pointer (clobbered by interrupts).
# -mcmodel=kernel -- Assume the kernel code is running in the higher half.
# -mgeneral-regs-only -- Prevent GCC from using a whole host of nonsense registers (that we have to enable).
# Hopefully preceded by -mgeneral-regs-only
# -mno-80387
# -mno-mmx
# -mno-3dnow
# -mno-sse -mno-sse2
# -MMD -- Something with the preprocessor?
set(_Z_COMPILE_FLAGS "${CMAKE_CXX_FLAGS} -ffreestanding -nostdlib -mabi=sysv -mno-red-zone -mcmodel=kernel -mgeneral-regs-only")
# -mno-80387 -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -MMD
set(_Z_LINK_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/linker.ld")
# -lgcc -- Link against gcc internals. Not sure if necessary.
# -nostdlib -- Don't try to link against the stdlib.
# -nostartfiles -- Don't try to link against crt0.s
# -static -- Prevent trying something with shared libraries (probably irrelevant).
# -z max-page-size=0x1000 -- Assume 4 KiB Pages.
set(_Z_LINK_FLAGS "-T ${_Z_LINK_SCRIPT} -lgcc -nostdlib -nostartfiles -static -z max-page-size=0x1000")
# Don't try to dynamically link.
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
set_target_properties(zion
PROPERTIES
COMPILE_FLAGS "${_Z_COMPILE_FLAGS}"
LINK_FLAGS "${_Z_LINK_FLAGS}"
)

9
zion/boot/limine.cfg Normal file
View file

@ -0,0 +1,9 @@
# Needs to be copied into the EFI partition of the drive.
TIMEOUT=10
:AcadiaOS
PROTOCOL=limine
KERNEL_PATH=boot:///zion

44
zion/linker.ld Normal file
View file

@ -0,0 +1,44 @@
OUTPUT_FORMAT(elf64-x86-64)
ENTRY (zion)
/* Define the program headers we want so the bootloader gives us the right */
/* MMU permissions */
PHDRS
{
text PT_LOAD FLAGS((1 << 0) | (1 << 2)) ; /* Execute + Read */
rodata PT_LOAD FLAGS((1 << 2)) ; /* Read only */
data PT_LOAD FLAGS((1 << 1) | (1 << 2)) ; /* Write + Read */
}
SECTIONS
{
. = 0xffffffff80000000;
/* Add a symbol that indicates the start address of the kernel. */
_kernel_start = .;
.text : {
*(.text .text.*)
} :text
/* Move to the next memory page for .rodata */
. += CONSTANT(MAXPAGESIZE);
.rodata : {
*(.rodata .rodata.*)
} :rodata
/* Move to the next memory page for .data */
. += CONSTANT(MAXPAGESIZE);
.data : {
*(.data .data.*)
} :data
.bss : {
*(COMMON)
*(.bss .bss.*)
} :data
/* Add a symbol that indicates the end address of the kernel. */
_kernel_end = .;
}

14
zion/zion.cpp Normal file
View file

@ -0,0 +1,14 @@
#include <stdint.h>
#define COM1 0x3f8
void outb(uint16_t port, uint8_t value) {
asm volatile("outb %0, %1" ::"a"(value), "Nd"(port));
}
extern "C" void zion() {
outb(COM1, 'a');
while (1)
;
}