summaryrefslogtreecommitdiff
path: root/kernel/kernel.ld
blob: 2bcbcbc59662e689f7365efbcc609f1dd7c074cc (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
OUTPUT_FORMAT("elf32-i386")
ENTRY(entry)

addr_phys = 0x00100000;
addr_virt = 0xc0000000;

addr_virt_end = ADDR(.bss) + SIZEOF(.bss);

addr_load_virt = LOADADDR(.text);
addr_load_virt_end = LOADADDR(.bss) + SIZEOF(.bss);

SECTIONS {
	
	.text_low addr_phys : {
		LONG(0x1badb002);
		LONG(0x00000003);
		LONG(-0x1badb002 -0x00000003);
		
		kernel/entry.o(.text)
		kernel/entry.o(.rodata*)
		. = ALIGN(0x1000);
	}
	
	.data_low : {
		kernel/entry.o(.data)
		. = ALIGN(0x1000);
	}
	
	.bss_low : {
		kernel/entry.o(.bss)
		. = ALIGN(0x1000);
		entry_pagedir = .; . += 0x1000;
		entry_pagetable_low = .; . += 0x1000;
		entry_pagetable_high = .; . += 0x1000;
		entry_stack = .; . += 0x1000; entry_stack_top = .;
	}
	
	.text addr_virt : AT(LOADADDR(.bss_low) + SIZEOF(.bss_low)) {
		magic_text = .; LONG(0x0f00ba02);
		*(.text)
		*(.rodata*)
		. = ALIGN(0x1000);
	}
	
	.data : AT(LOADADDR(.text) + SIZEOF(.text)) {
		magic_data = .; LONG(0x0f00ba03);
		*(.data)
		*(.ctors)
		. = ALIGN(0x1000);
	}
	
	.bss : AT(LOADADDR(.data) + SIZEOF(.data)) {
		*(.bss)
		*(COMMON)
		. = ALIGN(0x1000);
	}
}