Skip to content

Commit b068b5a

Browse files
committed
fix link cfg
1 parent 254d0b0 commit b068b5a

1 file changed

Lines changed: 46 additions & 17 deletions

File tree

kernel/ld/link.ld

Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
ENTRY(_start)
2+
13
/* 高半区虚拟基址与物理加载基址 */
2-
KERNEL_VMA = 0xFFFFFFFF80200000; /* 高半区虚拟地址(示例) */
3-
KERNEL_LMA = 0x00200000; /* 物理加载地址 2MiB */
4+
KERNEL_VBASE = 0xFFFFFFFF80000000;
5+
KERNEL_LBASE = 0x00200000; /* 2MB对齐,适合大页 */
46

5-
ENTRY(_start)
7+
/* VMA从虚拟基址开始 */
8+
. = KERNEL_VBASE;
69

710
PHDRS
811
{
@@ -13,27 +16,53 @@ PHDRS
1316

1417
SECTIONS
1518
{
16-
/* 把链接地址(VMA)移动到高半区 */
17-
. = KERNEL_VMA;
19+
/* 内核物理起始地址 */
20+
kernel_physical_start = KERNEL_LBASE;
1821

19-
.text : ALIGN(16)
22+
/* 代码段:VMA=虚拟地址, LMA=物理地址 */
23+
.text ALIGN(4K) : AT(KERNEL_LBASE)
2024
{
21-
KEEP(*(.text._start))
25+
KEEP(*(.text._start)) /* 确保_start在最前面 */
2226
*(.text .text.*)
23-
} :text AT(ADDR(.text) - KERNEL_VMA + KERNEL_LMA)
24-
25-
.rodata : ALIGN(16)
27+
} :text
28+
29+
/* RO数据紧接代码段 */
30+
.rodata ALIGN(4K) : AT(LOADADDR(.text) + SIZEOF(.text))
2631
{
2732
*(.rodata .rodata.*)
28-
} :rodata AT(ADDR(.rodata) - KERNEL_VMA + KERNEL_LMA)
29-
30-
.data : ALIGN(16)
33+
*(.got .got.*) /* GOT表通常放在这里 */
34+
} :rodata
35+
36+
/* 数据段 */
37+
.data ALIGN(4K) : AT(LOADADDR(.rodata) + SIZEOF(.rodata))
3138
{
3239
*(.data .data.*)
33-
} :data AT(ADDR(.data) - KERNEL_VMA + KERNEL_LMA)
34-
35-
.bss : ALIGN(16)
40+
} :data
41+
42+
/* BSS段:没有AT(),但需要设置加载地址到物理内存末尾 */
43+
.bss ALIGN(4K) :
3644
{
45+
__bss_start = . - KERNEL_VBASE; /* 物理地址 */
3746
*(.bss .bss.* COMMON)
38-
} :data AT(ADDR(.bss) - KERNEL_VMA + KERNEL_LMA)
47+
. = ALIGN(4K);
48+
__bss_end = . - KERNEL_VBASE; /* 物理地址 */
49+
} :data
50+
51+
/* 内核边界符号 */
52+
kernel_virtual_end = .;
53+
kernel_physical_end = LOADADDR(.data) + SIZEOF(.data) + SIZEOF(.bss);
54+
55+
/* 栈空间 */
56+
.stack ALIGN(4K) :
57+
{
58+
. += 64K;
59+
__stack_top = .;
60+
}
61+
62+
/* 丢弃不需要的段 */
63+
/DISCARD/ : {
64+
*(.comment)
65+
*(.note.gnu.property)
66+
*(.eh_frame)
67+
}
3968
}

0 commit comments

Comments
 (0)