blob: fd689dcfb3d78edf0695616955103b68b6c13e84 (
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
|
/* defs for Multiboot headers */
/* https://www.gnu.org/software/grub/manual/multiboot/multiboot.txt */
MB_MAGIC = 0x1badb002;
/* bit 0
* all boot modules loaded along with the operating system must be
* aligned on page (4KB) bit 1 must include mem_* structures
*/
MB_FLAGS = 0x3;
MB_CHKSUM = 0x100000000 - (MB_MAGIC + MB_FLAGS);
PROVIDE(KERNEL_OFFSET = 0xffff800000000000);
SECTIONS
{
. = 0x100000;
PROVIDE (___KERNEL_PM_START__ = . );
.boot :
{
header_start = .;
LONG(MB_MAGIC)
LONG(MB_FLAGS)
LONG(MB_CHKSUM)
LONG(0)
LONG(0)
LONG(0)
LONG(0)
LONG(0)
LONG(0)
LONG(0)
LONG(0)
LONG(0)
header_end = .;
}
.d32 :
{
*(".data32")
*(".data32.*")
}
/*
* basically the same as BSS, but I want some flexibility and I don't care
* for zeroing because it's explicitly overwritten anyways. I KNOW WHAT I'M
* DOING! An example is the idt.
*/
.reserved_0 (NOLOAD) :
{
*(".reserved_0")
*(".reserved_0.*")
}
/* global page table for 64-bit long mode */
.global_pagetable ALIGN(4096) (NOLOAD) :
{
*(".global_pagetable")
}
. = ALIGN(4096);
/* reserve space for a premitive stack based physical frame allocator */
/* each frame is 4KiB in size and has a 64bit (physical) address. e.g. */
/* for every 1 GiB physical memory we need 2 MiB space reserved for the */
/* free stack. For a easier bootstraping we are using a fix-sized stack */
/* array. Currently using 4GiB, therefore reserve 8MiB. */
PROVIDE (___FREE_PAGE_STACK__ = .);
.global_free_page_stack ALIGN(4096) (NOLOAD) :
{
*("..global_free_page_stack")
}
. = ALIGN(4096);
.t32 :
{
*(".text32")
*(".text.interrupt_gate")
}
. = . + KERNEL_OFFSET;
.text : AT(ADDR(.text) - KERNEL_OFFSET)
{
*(".text")
*(".text.*")
*(".text$")
}
.data : AT(ADDR(.data) - KERNEL_OFFSET)
{
*(".data")
*(".data.*")
*(".data$")
}
.bss : AT(ADDR(.bss) - KERNEL_OFFSET)
{
PROVIDE (___BSS_PM_START__ = .);
*(".bss")
*(".bss.*")
PROVIDE (___BSS_PM_END__ = .);
}
.rodata : AT(ADDR(.rodata) - KERNEL_OFFSET)
{
*(".rodata")
*(".rodata$")
*(".rodata.*")
}
PROVIDE (___KERNEL_PM_END__ = . - KERNEL_OFFSET);
}
|