FLASH_SIZE = 8 * 1024 * 1024; FLASH_START = 0x100000000 - FLASH_SIZE; MEM_SIZE = 128 * 1024 * 1024; RESET_VECTOR = 0xfffffff0; BIOS = 0xffffff00; KERNEL = 0xfffff000; USERSPACE = 0xffffe000; OS_LOAD_ADDR = 0x10000; OUTPUT_FORMAT("elf32-i386") MEMORY { flash : ORIGIN = FLASH_START, LENGTH = FLASH_SIZE ram : ORIGIN = 0x0, LENGTH = MEM_SIZE } SECTIONS { .kernel OS_LOAD_ADDR : AT (KERNEL) { _kernel_start = LOADADDR(.kernel); KEEP(*(.kernel*)) KEEP(*(.kernel.*)) _kernel_end = LOADADDR(.kernel) + SIZEOF(.kernel); } .userspace 0x0 : AT (USERSPACE) { _userspace_start = USERSPACE; KEEP(*(.userspace.text)) _userspace_end = USERSPACE + SIZEOF(.userspace); } .userspace.data 0x1000 : AT (USERSPACE + SIZEOF(.userspace)) { _userspace_data_start = LOADADDR(.userspace.data); KEEP(*(.rodata)) _userspace_data_end = LOADADDR(.userspace.data) + SIZEOF(.userspace.data); } .bios BIOS : { KEEP(*(.bios.gdt)) KEEP(*(.bios.gdt_ptr)) KEEP(*(.bios.text)) KEEP(*(.bios.jmp_pm)) } > flash .bios.reset_vector RESET_VECTOR : { KEEP(*(.bios.reset_vector)) FILL(0xab); . = ABSOLUTE(0x100000000); foo = .; } > flash /DISCARD/ : { *(.eh_frame) *(.comment) *(.note) *(.note.*) *(.note_*) } }