diff options
Diffstat (limited to 'source/kernel')
| -rw-r--r-- | source/kernel/CMakeLists.txt | 33 | ||||
| -rw-r--r-- | source/kernel/arch/x86_64/kern.ld | 139 | ||||
| -rw-r--r-- | source/kernel/src/entry.cpp | 9 |
3 files changed, 181 insertions, 0 deletions
diff --git a/source/kernel/CMakeLists.txt b/source/kernel/CMakeLists.txt new file mode 100644 index 0000000..c8e0c4a --- /dev/null +++ b/source/kernel/CMakeLists.txt @@ -0,0 +1,33 @@ +set(TEACHOS_KERNEL_LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/arch/${CMAKE_SYSTEM_PROCESSOR}/kern.ld") +mark_as_advanced(TEACHOS_KERNEL_LINKER_SCRIPT) + +add_executable("kernel" + "src/entry.cpp" +) + +target_compile_features("kernel" PRIVATE + "cxx_std_20" +) + +target_compile_options("kernel" PRIVATE + "$<$<CXX_COMPILER_ID:GNU>:-Wall>" + "$<$<CXX_COMPILER_ID:GNU>:-Wextra>" + "$<$<CXX_COMPILER_ID:GNU>:-Werror>" + "$<$<CXX_COMPILER_ID:GNU>:-pedantic-errors>" +) + +target_link_options("kernel" PRIVATE + "-T${TEACHOS_KERNEL_LINKER_SCRIPT}" +) + +target_link_libraries("kernel" PRIVATE + "-Wl,--whole-archive" + "teachos::boot" + "-Wl,--no-whole-archive" +) + +set_target_properties("kernel" PROPERTIES + CXX_EXTENSIONS OFF + CXX_STANDARD_REQUIRED YES + LINK_DEPENDS "${TEACHOS_KERNEL_LINKER_SCRIPT}" +) diff --git a/source/kernel/arch/x86_64/kern.ld b/source/kernel/arch/x86_64/kern.ld new file mode 100644 index 0000000..4e44cfa --- /dev/null +++ b/source/kernel/arch/x86_64/kern.ld @@ -0,0 +1,139 @@ +ENTRY(_start) + +/***************************************************************************** + * Virtual and linear start addresses of the TeachOS kernel + *****************************************************************************/ +TEACHOS_HIGH = -2048M; +TEACHOS_LOW = 1M; + +PHDRS { + boot_rodata PT_LOAD FLAGS(4); + boot_text PT_LOAD FLAGS(5); + boot_data PT_LOAD FLAGS(6); + + text PT_LOAD FLAGS(5); + data PT_LOAD FLAGS(6); + rodata PT_LOAD FLAGS(4); +} + +SECTIONS +{ + /*************************************************************************** + * Load the bootstrap code into low memory. We need to be accessible in + * 32-Bit mode, so we want to live down low, but we need to leave the 1MiB + * hole open since some BIOS functionality resides below it. + ***************************************************************************/ + . = TEACHOS_LOW; + + /*************************************************************************** + * We want to be able to be able to access all memory (linear and virtual) + * during bootstrapping and operation. To achieve this, we define some + * symbols at the beginning. + ***************************************************************************/ + _start_linear = .; + _start_virtual = . + TEACHOS_HIGH; + + /*************************************************************************** + * The bootstrapping infratructure goes first. We first place the read-only + * data, followed by our code, initialized mutable data, and finally our + * uninitialized mutable data. + ***************************************************************************/ + .boot_rodata : + { + KEEP(*(.boot_mbh)) + *(.boot_rodata) + } :boot_rodata + + .boot_text : + { + *(.boot_text) + } :boot_text + + .boot_data : + { + *(.boot_data) + } :boot_data + + .boot_bss : + { + *(.boot_bss) + *(.boot_stack) + } + + /*************************************************************************** + * Now it is time to load the 64-bit kernel code. We virtually load it into + * the upper 2GiB, while adjusting the linear load address appropriately. We + * also make sure to align the loaded data onto a page boundary. + ***************************************************************************/ + . = ALIGN(4K); + . += TEACHOS_HIGH; + + .init ALIGN(4K) : AT(ADDR (.init) - TEACHOS_HIGH) + { + /* + * Make sure that the crt code is wrapped around the compiler generated + * initialization code. + */ + KEEP(*:crti.s.obj(.init)) + KEEP(*(EXCLUDE_FILE (*crti.s.obj crtn.s.obj) .init)) + KEEP(*:crtn.s.obj(.init)) + } :text + + .fini ALIGN(4K) : AT(ADDR (.fini) - TEACHOS_HIGH) + { + /* + * Make sure that the crt code is wrapped around the compiler generated + * finalizer code. + */ + KEEP(*:crti.s.obj(.fini)) + KEEP(*(EXCLUDE_FILE (*crti.s.obj crtn.s.obj).fini)) + KEEP(*:crtn.s.obj(.fini)) + } + + .text ALIGN(4K) : AT(ADDR (.text) - TEACHOS_HIGH) + { + *(.text*) + } + + .rodata ALIGN(4K) : AT (ADDR (.rodata) - TEACHOS_HIGH) + { + *(.rodata) + *(.rodata.*) + } :rodata + + .ctors ALIGN(4K) : AT (ADDR (.ctors) - TEACHOS_HIGH) + { + KEEP(*crtbegin.o(.ctors)) + KEEP(*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP(*(SORT(.ctors.*))) + KEEP(*crtend.o(.ctors)) + } :data + + .dtors ALIGN(4K) : AT (ADDR (.dtors) - TEACHOS_HIGH) + { + KEEP(*crtbegin.o(.dtors)) + KEEP(*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP(*(SORT(.dtors.*))) + KEEP(*crtend.o(.dtors)) + } + + .data ALIGN(4K) : AT (ADDR (.data) - TEACHOS_HIGH) + { + *(.data) + } + + .bss ALIGN(4K) : AT (ADDR (.bss) - TEACHOS_HIGH) + { + *(COMMON) + *(.bss*) + } + + /*************************************************************************** + * In accordance with the symbol definitions at the start, we generate some + * symbols to mark the end of our loaded image. + ***************************************************************************/ + _end_virtual = ADDR(.bss) + SIZEOF(.bss); + _end_linear = _end_virtual - TEACHOS_HIGH; + + /DISCARD/ : { *(.comment) } +} diff --git a/source/kernel/src/entry.cpp b/source/kernel/src/entry.cpp new file mode 100644 index 0000000..0daf227 --- /dev/null +++ b/source/kernel/src/entry.cpp @@ -0,0 +1,9 @@ +namespace teachos +{ + extern "C" auto kernel_main() -> void + { + while(true) { + asm volatile ("nop"); + } + } +} |
