From: acevest Date: Sat, 13 Apr 2024 10:47:41 +0000 (+0800) Subject: 以一种更简洁的方式安排内核各个节的物理地址 X-Git-Url: http://zhaoyanbai.com/repos//%22http:/www.isc.org/%22?a=commitdiff_plain;h=7523d8ba3e5c236ec84ab2a83d8f45b8c469c8a2;p=kernel.git 以一种更简洁的方式安排内核各个节的物理地址 --- 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 = .;