/* * This file contains directives for the GNU linker which are specific * to the Intel 386ex evaluation board. * * COPYRIGHT (c) 1989-1999. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.OARcorp.com/rtems/license.html. * * $Id$ * * Memory layout: * * 0x3f80000 -> 0x3ff0000 : text section * 0x3ff0000 -> 0x3ff0028 : global descriptor table in ROM * 0x3ff0028 -> 0x3fff000 : data section ( copied by start.s to RAM ) * 0x3fff000 -> 0x3fffff0 : initial section ( init 386ex, goto protected mode, copy ROM-RAM ) * 0x3fffff0 -> 0x4000000 : reset section ( jmp to initial only ) */ ENTRY(reset) ; SECTIONS { /**************************************************************************************** * data section: * * This section defines the locations of the data section in ROM as well as in RAM. * start.s copies the data section to RAM in real mode. This is done PRIOR to the lgdt * instruction since the data section contains the Global_descriptor_table and GDTR. ***********************************************************************************/ _rom_data_start = 0x3ff0000; _rom_data_segment = 0xF000; _rom_data_offset = 0x0; _ram_data_segment = 0x0000 ; _ram_data_offset = 0x0; _ram_data_location = _ram_data_segment * 16 + _ram_data_offset; .data : AT ( _rom_data_start ) { _sdata = .; *(.data); _edata = .; } _data_start = ADDR(.data) ; data_start = _data_start ; _data_size = _edata - _sdata ; /************************************************************************************** * bss section: * * The bss section is the last section in RAM. *************************************************************************************/ _edata = ALIGN( 0x10 ); .bss : { _bss_start = .; *(.bss); *(COMMON); _ebss = ALIGN(0x10); end = _ebss; _end = end; __end = end; } _bss_size = _ebss - _bss_start ; /************************************************************************************** * General variables: * * The stack_size variable is customizable here. The heap is located directly after * The stack in RAM. A routine within bspstart.c uses these variables to ensure that * the heap used by RTEMS is as large as the RAM remaining after all workspace configurations * are complete. *************************************************************************************/ stack_size = 0x8000 ; stack_origin = end + stack_size ; heap_bottom = stack_origin + 4 ; /*************************************************************************************** * text section: * * This section is NOT copied into RAM. It is left in ROM, as the flash ROM is quick enough. ***************************************************************************************/ .text ( 0x3f80000 ): { CREATE_OBJECT_SYMBOLS text_start = . ; _text_start = . ; *(.text ) ; . = ALIGN (16); *(.eh_fram) . = ALIGN (16); /* * C++ constructors */ __CTOR_LIST__ = .; LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) *(.ctors) LONG(0) __CTOR_END__ = .; . = ALIGN (4) ; __DTOR_LIST__ = .; LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) *(.dtors) LONG(0) __DTOR_END__ = .; _rodata_start = . ; *(.rodata) *(.gnu.linkonce.r*) _erodata = ALIGN( 0x10 ) ; _etext = ALIGN( 0x10 ); _endtext = . ; } /******************************************************************************************* * initial section: * * This section is defined after the data section. It must be in the top 64K of memory * to enable the initial short jmp from the reset section while still in real-mode. It * initializes the i386ex, moves the gdt from ROM to RAM,loads the gdt, * jumps to protected mode, copies the data section from ROM to RAM and loads the idt. ******************************************************************************************/ .initial _rom_data_start + _data_size : { *(.initial); } /******************************************************************************************* * board reset section: * * This section contains the short jmp from the reset section to the initial section. It is * the first code executed on reset/power on. ******************************************************************************************/ .reset 0x3fffff0: { *(.reset); } }