aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/scripts/kernel.ld
blob: a429570eafa3d1d5d221d2d4e3e0f874ac8671e1 (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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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)
  {
    *(.rodata*)
  } :kernel_rodata

  .kernel_data ALIGN(4K) : AT (ADDR (.kernel_data) - TEACHOS_VMA)
  {
    *(.data*)
  } :kernel_data

  . += 4K;

  .kernel_bss ALIGN(4K) : AT (ADDR (.kernel_bss) - TEACHOS_VMA)
  {
    *(.stack .bss*)
  } :kernel_data

  .kernel_text ALIGN(4K) : AT(ADDR (.kernel_text) - TEACHOS_VMA)
  {
    *(.text*)
  } :kernel_text

  /***************************************************************************
   * Finally, we load the user-accessible code and data.
   ***************************************************************************/

  .user_rodata ALIGN(4K) : AT (ADDR (.user_rodata) - TEACHOS_VMA)
  {
    KEEP(*(.user_rodata*))
  } :user_rodata

  .user_data ALIGN(4K) : AT (ADDR (.user_data) - TEACHOS_VMA)
  {
    KEEP(*(.user_data*))
  } :user_data

  . += 4K;

  .user_bss ALIGN(4K) : AT(ADDR (.user_bss) - TEACHOS_VMA)
  {
    KEEP(*(.user_bss*))
  } :user_data

  .user_text ALIGN(4K) : AT(ADDR (.user_text) - TEACHOS_VMA)
  {
    KEEP(*(.user_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) }
}