0

关于开发一个小内核,我正在关注这本书: https ://littleosbook.github.io

我已经到了必须链接二进制文件的地步,我想确保在继续之前了解链接器脚本:

ENTRY(loader)                /* the name of the entry label */
SECTIONS {
    . = 0x00100000;          /* the code should be loaded at 1 MB */
    .text ALIGN (0x1000) :   /* align at 4 KB */
    {
        *(.text)             /* all text sections from all files */
    }
    .rodata ALIGN (0x1000) : /* align at 4 KB */
    {
        *(.rodata*)          /* all read-only data sections from all files */
    }
    .data ALIGN (0x1000) :   /* align at 4 KB */
    {
        *(.data)             /* all data sections from all files */
    }
    .bss ALIGN (0x1000) :    /* align at 4 KB */
    {
        *(COMMON)            /* all COMMON sections from all files */
        *(.bss)              /* all bss sections from all files */
    }
}

首先,为什么要具体说明ALIGN章节(4KB)?(我认为这不太可能与优化有关,或者我可能弄错了,这可能是出于性能原因,否则我认为启动过程没有限制 - 通过删除ALIGN脚本中的函数调用来确认)

然后考虑要链接的可执行文件:

 global loader                   ; the entry symbol for ELF

    MAGIC_NUMBER equ 0x1BADB002     ; define the magic number constant
    FLAGS        equ 0x0            ; multiboot flags
    CHECKSUM     equ -MAGIC_NUMBER  ; calculate the checksum
                                    ; (magic number + checksum + flags should equal 0)

    section .text:                  ; start of the text (code) section
    align 4                         ; the code must be 4 byte aligned
        dd MAGIC_NUMBER             ; write the magic number to the machine code,
        dd FLAGS                    ; the flags,
        dd CHECKSUM                 ; and the checksum

    loader:                         ; the loader label (defined as entry point in linker script)
        mov eax, 0xCAFEBABE         ; place the number 0xCAFEBABE in the register eax
    .loop:
        jmp .loop                   ; loop forever

我说.rodata, 和.bss部分还不需要吗?(因为内核仍然可以正常启动)

从这个小链接描述文件中,还有什么我无法从ld手册中理解的东西(我读了一点以了解点、theSECTIONS和入口点)吗?

看来我可以在脚本中重新排列节的顺序,内核仍然可以工作,这是为什么呢?

4

0 回答 0