blob: 9a5dfd8b3984f018e078f575f70730a42dfe8df5 (
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
129
130
131
132
|
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) }
}
|