aboutsummaryrefslogtreecommitdiff
path: root/kernel/link.ld
blob: e8d647e879194ad7e6ec81aea87d615ca080052a (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
OUTPUT_FORMAT(elf64-x86-64)

KERNEL_LMA = 0x00100000;
KERNEL_VMA = 0xffff800000000000;

ENTRY(_start)
STARTUP(entry/entry.o)

SECTIONS {
	. = KERNEL_VMA + KERNEL_LMA;

	k_start = .;

	.text : AT(ADDR(.text) - KERNEL_VMA) {
		_code = .;
		*(.multiboot)
		*(.text)
		. = ALIGN(0x1000);
	}

	csd_start = .;
	.csd : AT(ADDR(.csd) - KERNEL_VMA) {
		*(.csd)
		. = ALIGN(0x1000);
	}
	csd_end = .;

	.init :  AT(ADDR(.init) - KERNEL_VMA) {
		kernel_start_init = .;
		*(.init)
		. = ALIGN(0x1000);
		kernel_end_init = .;
	}


	.rodata : AT(ADDR(.rodata) - KERNEL_VMA) {
		_rodata = .;
		*(.rodata)
		. = ALIGN(0x1000);
	}

	.data : AT(ADDR(.data) - KERNEL_VMA) {
		_data = .;
		*(.data)
		. = ALIGN(0x1000);
	}

	_edata = .;

	.bss : AT(ADDR(.bss) - KERNEL_VMA) {
		_bss = .;
		*(.bss)
		*(COMMON)
		. = ALIGN(0x1000);
	}

	_end = .;

	/DISCARD/ : {
		*(.comment)
		*(note.*)
	}
	kernel_phys_off = k_start - KERNEL_LMA;
	kernel_phys_base = k_start - kernel_phys_off;
	kernel_phys_end = _end - kernel_phys_off;
	kernel_page_tables = ((_end - k_start) / 0x80000) + 1; /* XXX might be 0x200000 */
	kernel_text_sectors = ((_end - k_start) / 512) + 1;
}