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