aboutsummaryrefslogtreecommitdiff
path: root/source/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'source/kernel')
-rw-r--r--source/kernel/CMakeLists.txt33
-rw-r--r--source/kernel/arch/x86_64/kern.ld139
-rw-r--r--source/kernel/src/entry.cpp9
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");
+ }
+ }
+}