ENTRY(_start) /***************************************************************************** * Virtual and linear start addresses of the TeachOS kernel *****************************************************************************/ TEACHOS_PMA = 1M; TEACHOS_VMA = 0xFFFFFFFF80000000; 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_PMA; /*************************************************************************** * We want to be able to be able to access all memory (physical and virtual) * during bootstrapping and operation. To achieve this, we define some * symbols at the beginning. ***************************************************************************/ _start_physical = .; _start_virtual = . + TEACHOS_VMA; /*************************************************************************** * 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 ALIGN(4K) : AT(ADDR (.boot_rodata)) { KEEP(*(.boot_mbh)) *(.boot_rodata) } :boot_rodata .boot_text ALIGN(4K) : AT(ADDR (.boot_text)) { *(.boot_text) } :boot_text .boot_bss ALIGN(4K) : AT(ADDR (.boot_bss)) { *(.boot_bss) *(.boot_stack) } .boot_data ALIGN(4K) : AT(ADDR (.boot_data)) { *(.boot_data) } :boot_data /*************************************************************************** * Now it is time to load the 64-bit kernel code. We * make sure to align the loaded data onto a page boundary. ***************************************************************************/ . = ALIGN(4K); . += TEACHOS_VMA; .stl_text ALIGN(4K) : AT(ADDR (.stl_text) - TEACHOS_VMA) { *(.stl_text .stl_text*) KEEP(*libstdc++.a:*(.text .text.*)) } :text .text ALIGN(4K) : AT(ADDR (.text) - TEACHOS_VMA) { *(.text .text.*) } .user_text ALIGN(4K) : AT(ADDR (.user_text) - TEACHOS_VMA) { *(.user_text .user_text.*) } .rodata ALIGN(4K) : AT (ADDR (.rodata) - TEACHOS_VMA) { *(.rodata) *(.rodata.*) } :rodata .ctors ALIGN(4K) : AT (ADDR (.ctors) - TEACHOS_VMA) { __ctors_start = .; KEEP(*(SORT(.ctors.*))) KEEP(*(.ctors)) __ctors_end = .; } :data .init_array ALIGN(4K) : AT (ADDR (.init_array) - TEACHOS_VMA) { __init_array_start = .; KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*))) KEEP(*(.init_array)) __init_array_end = .; } .bss ALIGN(4K) : AT (ADDR (.bss) - TEACHOS_VMA) { *(COMMON) *(.bss*) } .data ALIGN(4K) : AT (ADDR (.data) - TEACHOS_VMA) { *(.data*) } .user_data ALIGN(4K) : AT (ADDR (.user_data) - TEACHOS_VMA) { *(.user_data .user_data.*) } /*************************************************************************** * In accordance with the symbol definitions at the start, we generate some * symbols to mark the end of our loaded image. ***************************************************************************/ _end_virtual = .; _end_physical = _end_virtual - TEACHOS_VMA; /DISCARD/ : { *(.comment) } }