关于开发一个小内核,我正在关注这本书: 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
和入口点)吗?
看来我可以在脚本中重新排列节的顺序,内核仍然可以工作,这是为什么呢?