Assembly 在Grub2中引导自定义内核

Assembly 在Grub2中引导自定义内核,assembly,x86,osdev,multiboot,Assembly,X86,Osdev,Multiboot,我想用Grub2启动一个自定义内核。我使用了旧的(grub 1)多引导头: .set flags, 0x0 .set magic, 0x1badb002 .set checksum, -(magic + flags) .align 4 .long magic .long flags .long checksum ... movl %eax, magic .set flags, 0x0 .set magic, 0xe85250d6 .set magic_the_second, 0x36d7

我想用Grub2启动一个自定义内核。我使用了旧的(grub 1)多引导头:

.set flags, 0x0
.set magic, 0x1badb002
.set checksum, -(magic + flags)

.align 4
.long magic
.long flags
.long checksum

...

movl %eax, magic
.set flags, 0x0
.set magic, 0xe85250d6
.set magic_the_second, 0x36d76289
.set checksum, -(magic + flags)

.align 4
.long magic
.long flags
.long checksum

...

movl %eax, magic_the_second
但它不适用于Grub2,因此我搜索了新的多引导规范并找到了它: (这不是真正的规范,只是一个头文件)

所以,现在我使用这个多引导头:

.set flags, 0x0
.set magic, 0x1badb002
.set checksum, -(magic + flags)

.align 4
.long magic
.long flags
.long checksum

...

movl %eax, magic
.set flags, 0x0
.set magic, 0xe85250d6
.set magic_the_second, 0x36d76289
.set checksum, -(magic + flags)

.align 4
.long magic
.long flags
.long checksum

...

movl %eax, magic_the_second
但它也不起作用: 没有多引导头

有什么建议吗


谢谢

Multiboot 2使用与原始Multiboot不同的结构(即,它使用标记结构)

下面是我以前的一个项目的示例标题:

    # multiboot 2 header (see http://download-mirror.savannah.gnu.org/releases/grub/phcoder/multiboot.pdf)
    .balign 8
mbhdr:
    .long 0xe85250d6 # magic
    .long 0 # architecture (i386, 32-bit)
    .long .LhdrEnd-mbhdr # header length
    .long -(.LhdrEnd-mbhdr+0xe85250d6) # checksum
    # tags
    # module align
    .word 6 # type
    .word 0 # flags
    .long 8 # size in bytes (spec says 12?)
    .balign 8
    # loader entry
    .word 3
    .word 0
    .long 12
    .long entry
    .balign 8
    # console flags
    .word 4
    .word 0
    .long 12
    .long 0x03 # EGA text support, require console
    .balign 8
    # info request 
    .word 1
    .word 0
    .long 4*6+8
    .long 5 # BIOS boot device
    .long 1 # command line
    .long 3 # modules
    .long 9 # ELF symbols
    .long 6 # memory map
    .long 10 # APM table
    .balign 8
    # address info
    .word 2 # type
    .word 0 # flags
    .long 24 # size
    .long mbhdr # header load addr
    .long 0x100000 # load addr
    .long 0 # load end addr (entire file)
    .long 0 # BSS end addr (no BSS)
    .balign 8
    # terminating tag
    .word 0
    .word 0
    .long 8
.LhdrEnd:

谢谢,但是否需要所有信息?或者从#multiboot 2 header到#tags?我认为加载器条目和地址信息是所有需要的(当然还有结尾的),但是我会检查代码中的链接,以确保如果内核是ELF格式的,那么除了终止标记之外,不需要其他标记。