我正在尝试编写64位内核。 但是,我在组装和链接的elf文件中发现了一些奇怪的东西。 这是内核的存根。
stub.asm
[bits 64]
KERNEL_STACK_SIZE equ 65536 ; 64 KiB stack
;Reserve space for stack
section .bss
global kernel_stack
kernel_stack:
resb KERNEL_STACK_SIZE
section .text
global kernel_start
kernel_start:
kernel_end:
cli
hlt
jmp kernel_end
这是我与x86_64-elf-ld(gcc交叉编译器)一起使用的链接描述文件。
ENTRY(kernel_start);
SECTIONS
{
. = 0x300000;
.text : ALIGN(0x1000)
{
*(.text);
}
.data : ALIGN(0x1000)
{
*(.data);
}
.rodata : ALIGN(0x1000)
{
*(.rodata*);
}
.bss : ALIGN(0x1000)
{
*(COMMON);
*(.bss);
}
}
链接描述文件有效但生成的elf大小超过1 MiB(确切地说是1049280字节)。 入口点有效且在0x300000,但它出现在文件的偏移量0x100000处,并且elf程序头告诉从文件的开头(包括所有标题)加载到0x200000的.text部分的末尾
链接描述文件有问题吗?