Barebones Kernel Commit
Uses limine to boot off of a disk. Outputs a character to the debug port.
This commit is contained in:
commit
e9705f7579
|
@ -0,0 +1 @@
|
|||
builddbg/
|
|
@ -0,0 +1,24 @@
|
|||
cmake_minimum_required(VERSION 3.2)
|
||||
|
||||
# Set because our cross compiler can't do dynamic linking?
|
||||
set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
|
||||
|
||||
project(AcadiaOS VERSION 0.0.1 LANGUAGES CXX ASM-ATT)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 20)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED True)
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS True)
|
||||
|
||||
add_subdirectory(zion)
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT disk.img
|
||||
COMMAND sudo sh ../scripts/build_image.sh disk.img
|
||||
DEPENDS zion
|
||||
USES_TERMINAL
|
||||
)
|
||||
|
||||
add_custom_target(qemu
|
||||
COMMAND qemu-system-x86_64 -d guest_errors -m 1G -serial stdio -hda disk.img --boot c
|
||||
DEPENDS disk.img
|
||||
USES_TERMINAL)
|
|
@ -0,0 +1,2 @@
|
|||
#! /bin/bash
|
||||
cmake -B builddbg/ -G Ninja -D CMAKE_CXX_COMPILER=x86_64-elf-gcc -D CMAKE_ASM-ATT_COMPILER=x86_64-elf-as -D CMAKE_BUILD_TYPE=Debug
|
|
@ -0,0 +1,39 @@
|
|||
#!/us
|
||||
|
||||
set -e
|
||||
|
||||
if [[ $# -ne 1 ]]; then
|
||||
echo "Must specify disk image name."
|
||||
fi
|
||||
|
||||
dd if=/dev/zero of=$1 bs=1M count=200
|
||||
|
||||
dev=$(losetup --find --partscan --show $1)
|
||||
if [ -z "$dev" ]; then
|
||||
echo "Couldn't mount loopback device"
|
||||
exit 1;
|
||||
fi
|
||||
echo "Loopback device: ${dev}"
|
||||
|
||||
cleanup() {
|
||||
umount efi
|
||||
rm -rf efi
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
parted -s $dev mklabel gpt mkpart EFI fat32 1MiB 10MiB mkpart ext2 10MiB 100% set 1 esp on
|
||||
mkfs.fat -F 12 "${dev}p1"
|
||||
mke2fs "${dev}p2"
|
||||
|
||||
limine-deploy "${dev}"
|
||||
|
||||
mkdir -p efi/
|
||||
mount "${dev}p1" efi/
|
||||
|
||||
mkdir -p efi/EFI/BOOT
|
||||
cp /usr/share/limine/BOOTX64.EFI efi/EFI/BOOT
|
||||
cp /usr/share/limine/limine.sys efi/
|
||||
cp ../zion/boot/limine.cfg efi/
|
||||
cp zion/zion efi/
|
||||
|
||||
chown drew:drew $1
|
|
@ -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}"
|
||||
)
|
|
@ -0,0 +1,9 @@
|
|||
# Needs to be copied into the EFI partition of the drive.
|
||||
|
||||
TIMEOUT=10
|
||||
|
||||
:AcadiaOS
|
||||
|
||||
PROTOCOL=limine
|
||||
|
||||
KERNEL_PATH=boot:///zion
|
|
@ -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 = .;
|
||||
}
|
|
@ -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)
|
||||
;
|
||||
}
|
Loading…
Reference in New Issue