我正在关注Bran的内核开发tutorial。在他的汇编代码中,他有以下代码块,他描述的代码不是那么重要,而是与GRUB有关。
; This part MUST be 4byte aligned, so we solve that issue using 'ALIGN 4'
ALIGN 4
mboot:
; Multiboot macros to make a few lines later more readable
MULTIBOOT_PAGE_ALIGN equ 1<<0
MULTIBOOT_MEMORY_INFO equ 1<<1
MULTIBOOT_AOUT_KLUDGE equ 1<<16
MULTIBOOT_HEADER_MAGIC equ 0x1BADB002
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_AOUT_KLUDGE
MULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
EXTERN code, bss, end
; This is the GRUB Multiboot header. A boot signature
dd MULTIBOOT_HEADER_MAGIC
dd MULTIBOOT_HEADER_FLAGS
dd MULTIBOOT_CHECKSUM
; AOUT kludge - must be physical addresses. Make a note of these:
; The linker script fills in the data for these ones!
dd mboot
dd code
dd bss
dd end
dd start
我还想知道这段代码在做什么?有人可以给我或指出我可以在哪里找到关于此的描述。其次,为什么这段代码需要4字节对齐?这是出于效率原因还是在GRUB环境中具有一些特殊意义?
答案 0 :(得分:8)
这个程序集不是代码,而是多引导头。链接内核时,此标头将放在二进制文件的开头,因此GRUB可以看到您的内核符合多重引导。 此标头包含一个幻数(0x1badb002),一个标志列表(在您的情况下,内核应该在页面对齐的地址上加载,并且您希望GRUB为您提供内存映射)和校验和。 如果其中一个条目不遵循多重引导规范,GRUB将不会加载您的内核。
您可以在GRUB的多重启动手册中找到有关多重启动的更多信息:
http://www.gnu.org/software/grub/manual/multiboot/multiboot.html
从手册中引用:
除了操作系统映像使用的格式标题外,操作系统映像还必须包含一个名为Multiboot标头的附加标头。 Multiboot标头必须完全包含在OS映像的前8192个字节中,必须是长字(32位)对齐。一般来说,它应该尽早出现,并且可以嵌入到真正的可执行文件头之后的文本段的开头。
我不确定AOUT kludge的作用。我只在我的操作系统中使用ELF。 我遵循了这个指南:http://wiki.osdev.org/Bare_Bones