From 7523d8ba3e5c236ec84ab2a83d8f45b8c469c8a2 Mon Sep 17 00:00:00 2001 From: acevest Date: Sat, 13 Apr 2024 18:47:41 +0800 Subject: [PATCH] =?utf8?q?=E4=BB=A5=E4=B8=80=E7=A7=8D=E6=9B=B4=E7=AE=80?= =?utf8?q?=E6=B4=81=E7=9A=84=E6=96=B9=E5=BC=8F=E5=AE=89=E6=8E=92=E5=86=85?= =?utf8?q?=E6=A0=B8=E5=90=84=E4=B8=AA=E8=8A=82=E7=9A=84=E7=89=A9=E7=90=86?= =?utf8?q?=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- scripts/link.ld | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/scripts/link.ld b/scripts/link.ld index 5736596..0bf67e7 100644 --- a/scripts/link.ld +++ b/scripts/link.ld @@ -16,16 +16,21 @@ OUTPUT_FORMAT("elf32-i386") ENTRY(kernel_entry) + +/* 内核加载的物理地址 */ kernel_loaded_physic_addr = 0x100000; +/* 内核虚拟地址空间的起始地址 */ kernel_virtual_addr_start = 0xC0000000; +/* 内核起始地址在虚拟地址空间中的起始地址 */ kernel_begin = kernel_virtual_addr_start + kernel_loaded_physic_addr; + + SECTIONS { . = kernel_begin; - .text : AT(phys_addr) ALIGN(0x1000) + .text : AT(kernel_loaded_physic_addr) ALIGN(0x1000) { code = .; - phys_addr = . - kernel_virtual_addr_start; *(.kernel_entry_text) *(.multiboot2_header) /* 单独把 multiboot.S 的 .text 放在这个位置是为了便于调试,实际是可以不写这一句的 */ @@ -35,20 +40,22 @@ SECTIONS *(.sysexit) /* last */ } etext = .; - .data : AT(phys_addr) ALIGN(0x1000) + + /* 后续节的物理地址(也就是 LMA: Load Memory Address 加载内存地址)会根据 .text 节的自动计算,不用再每个都写一遍 AT 指令了 */ + + .data : ALIGN(0x1000) { data = .; - phys_addr = . - kernel_virtual_addr_start; *(.data) } edata = .; - .bss : AT(phys_addr) ALIGN(0x1000) + + + .bss : ALIGN(0x1000) { bss = .; - phys_addr = . - kernel_virtual_addr_start; *(.bss); } - ebss = .; end = .; -- 2.44.0