OUTPUT_ARCH(riscv)  /* 目标平台 */
ENTRY(_start)  /* 设置程序入口点为entry.asm中定义的全局符号 */
BASE_ADDRESS = 0x80200000;  /* 一个常量, 我们的kernel将来加载到这个物理地址 */

SECTIONS
{
    . = BASE_ADDRESS;  /* 我们对 . 进行赋值, 调整接下来的段的开始位置放在我们定义的常量出 */
/*    skernel = .;*/

    stext = .;  /* .text段的开始位置 */
    .text : {  /* 表示生成一个为 .text的段, 花括号内按照防止顺序表示将输入文件中的哪些段放在 当前.text段中 */
        *(.text.entry)  /* entry.asm中, 我们自己定义的.text.entry段, 被放在顶部*/
        *(.text .text.*)
    }

    . = ALIGN(4K);
    etext = .;
    srodata = .;
    .rodata : {
        *(.rodata .rodata.*)
        *(.srodata .srodata.*)
    }

    . = ALIGN(4K);
    erodata = .;
    sdata = .;
    .data : {
        *(.data .data.*)
        *(.sdata .sdata.*)
    }

    . = ALIGN(4K);
    edata = .;
    .bss : {
        *(.bss.stack)  /* 全局符号 sbss 和 ebss 分别指向 .bss 段除 .bss.stack 以外的起始和终止地址(.bss.stack是我们在entry.asm中定义的栈) */
        sbss = .;
        *(.bss .bss.*)
        *(.sbss .sbss.*)
    }

    . = ALIGN(4K);
    ebss = .;
    ekernel = .;

    /DISCARD/ : {
        *(.eh_frame)
    }
}