]> Zhao Yanbai Git Server - kernel.git/commitdiff
以一种更简洁的方式安排内核各个节的物理地址
authoracevest <zhaoyanbai@126.com>
Sat, 13 Apr 2024 10:47:41 +0000 (18:47 +0800)
committeracevest <zhaoyanbai@126.com>
Sat, 13 Apr 2024 15:22:44 +0000 (23:22 +0800)
scripts/link.ld

index 5736596c8fbf6d0613b48f8b8387b0c057314412..0bf67e706933f244c1a0c8f77a6e310884eded54 100644 (file)
 
 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 = .;