ENTRY(_start) /***************************************************************************** * Virtual and linear start addresses of the TeachOS kernel *****************************************************************************/ PROVIDE_HIDDEN(TEACHOS_PMA = 1M); PROVIDE_HIDDEN(TEACHOS_VMA = -2048M); PHDRS { boot_rodata PT_LOAD FLAGS(4); boot_text PT_LOAD FLAGS(5); boot_data PT_LOAD FLAGS(6); kernel_rodata PT_LOAD FLAGS(4); kernel_text PT_LOAD FLAGS(5); kernel_data PT_LOAD FLAGS(6); user_rodata PT_LOAD FLAGS(4); user_text PT_LOAD FLAGS(5); user_data PT_LOAD FLAGS(6); } 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. ***************************************************************************/ PROVIDE_HIDDEN(_start_physical = .); PROVIDE_HIDDEN(_start_virtual = . + TEACHOS_VMA); .boot_rodata ALIGN(4K) : { KEEP(*(.boot_mbh .boot_rodata*)) } :boot_rodata .boot_data ALIGN(4K) : { KEEP(*(.boot_data*)) PROVIDE_HIDDEN(__init_array_start = .); KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN(__init_array_end = .); } :boot_data .boot_bss ALIGN(4K) : { KEEP(*(.boot_stack .boot_bss*)) } :boot_data .boot_text ALIGN(4K) : { KEEP(*(.boot_text*)) } :boot_text /*************************************************************************** * 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; .kernel_rodata ALIGN(4K) : AT (ADDR (.kernel_rodata) - TEACHOS_VMA) { *(EXCLUDE_FILE (*libstdc++.a:*) .rodata*) } :kernel_rodata .kernel_data ALIGN(4K) : AT (ADDR (.kernel_data) - TEACHOS_VMA) { *(EXCLUDE_FILE (*libstdc++.a:*) .data*) } :kernel_data . += 4K; .kernel_bss ALIGN(4K) : AT (ADDR (.kernel_bss) - TEACHOS_VMA) { *(EXCLUDE_FILE (*libstdc++.a:*) .stack .bss*) } :kernel_data .kernel_text ALIGN(4K) : AT(ADDR (.kernel_text) - TEACHOS_VMA) { *(EXCLUDE_FILE (*libstdc++.a:*) .text*) } :kernel_text /*************************************************************************** * Finally, we load the user-accessible code and data. ***************************************************************************/ .user_rodata ALIGN(4K) : AT (ADDR (.user_rodata) - TEACHOS_VMA) { *(.stl_rodata* .user_rodata*) KEEP(*libstdc++.a:*(.rodata*)) } :user_rodata .user_data ALIGN(4K) : AT (ADDR (.user_data) - TEACHOS_VMA) { *(.stl_data* .user_data*) KEEP(*libstdc++.a:*(.data*)) } :user_data . += 4K; .user_bss ALIGN(4K) : AT(ADDR (.user_bss) - TEACHOS_VMA) { *(.stl_bss* .user_bss*) KEEP(*libstdc++.a:*(.bss*)) } :user_data .user_text ALIGN(4K) : AT(ADDR (.user_text) - TEACHOS_VMA) { KEEP(*(.stl_text* .user_text*)) KEEP(*libstdc++.a:*(.text*)) } :user_text /*************************************************************************** * In accordance with the symbol definitions at the start, we generate some * symbols to mark the end of our loaded image. ***************************************************************************/ PROVIDE_HIDDEN(_end_virtual = .); PROVIDE_HIDDEN(_end_physical = _end_virtual - TEACHOS_VMA); /DISCARD/ : { *(.comment) } }