summaryrefslogtreecommitdiff
path: root/src/kernel.lds
blob: f4f209a90b6ce210062ff3e628de17240c6ceb5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*
 * This linker script is used to drive the link step of the kernel, by e.g.
 * forcing the linker to use specific addresses when allocating space for
 * sections and symbols.
 *
 * It assumes flat physical memory (RAM) starting at 0, of size 64MB,
 * of which only "upper memory", starting at 1MB, is used.
 *
 * On x86, the first 1MB of physical memory is where legacy BIOS mappings
 * are mapped. Completely skip that region for convenience.
 *
 * For a map of lower memory, see http://wiki.osdev.org/Memory_Map_(x86).
 */

/*
 * Override the default entry point. This sets the address of the first
 * instruction run when the boot loader passes control to the kernel.
 */
ENTRY(boot_start)

/*
 * The memory command is used to describe regions of memory. Here, a single
 * region of RAM is defined. Adding another region, such as the video RAM
 * at 0xa0000, would allow other commands in this script to allocate symbols
 * out of that region.
 *
 * Describing memory regions is optional. It is best used when building for
 * known devices with a specific memory layout.
 */
MEMORY
{
    RAM : ORIGIN = 1M, LENGTH = 63M
}

/*
 * The program headers define segments in the ELF image. they are used to
 * fix properties on sections mapped to segments. Here, the PT_LOAD flag
 * tells the boot loader that a segment must actually be loaded from the
 * ELF image to memory. Some sections, such as most debugging sections, are
 * normally not loaded to memory. FLAGS are used to set Unix-like
 * permissions to a segment, so that a value of 4 means the segment may
 * only contain read-only non-executable data, 5 (4 + 1) means read-only
 * executable data (normally instructions), and 6 (4 + 2) means read-write
 * non-executable data.
 *
 * The hdr segment is meant to contain the multiboot header. The name "text"
 * is the historical name used to refer to instructions.
 *
 * See https://sourceware.org/binutils/docs-2.29/ld/index.html.
 */
PHDRS
{
    hdr     PT_LOAD FLAGS(4);
    text    PT_LOAD FLAGS(5);
    data    PT_LOAD FLAGS(6);
}

/*
 * Sections define how the image data are partitioned.
 *
 * Common sections include :
 *
 *  - .text
 *      The code section.
 *  - .data
 *      The section for initialized data (e.g. static int var = 123;).
 *  - .bss
 *      The section for uninitialized data (e.g. static int var;). Its name
 *      is historical and means "Block Started by Symbol". The .bss section
 *      is special in that it takes no space in the kernel image, because
 *      it's filled with bytes of value 0. Its size in memory is stored
 *      in the ELF file, and in this case, the boot loader initializes the
 *      memory for the .bss section.
 *
 * Here, an additional section is used to store the multiboot header, and
 * any section for read-only data produced by the compiler is forced into
 * the .data section.
 *
 * Sections are allocated out of the RAM memory region, and mapped to heir
 * corresponding program headers segment.
 *
 * See https://sourceware.org/binutils/docs-2.29/ld/Input-Section-Basics.html#Input-Section-Basics
 * for more information about the syntax used below.
 */
SECTIONS
{
    .hdr : {
        *(.hdr)
    } > RAM : hdr

    .text : {
        *(.text*)
    } > RAM : text

    .data : {
        *(.rodata*)
        *(.data*)
    } > RAM : data

    .bss : {
        *(.bss)
    } > RAM : data

    /*
     * The .eh_frame section is used by DWARF tools to unwind the stack,
     * allowing software to dump stack traces. Although this section could
     * safely be left in the kernel image, it may confuse people who
     * disassemble it.
     */
    /DISCARD/ : {
        *(.eh_frame)
    }
}