OSDev.org

The Place to Start for Operating System Developers
It is currently Thu Mar 28, 2024 10:16 am

All times are UTC - 6 hours




Post new topic Reply to topic  [ 3 posts ] 
Author Message
 Post subject: Multiboot2 header: unrecognized tag
PostPosted: Fri May 11, 2018 10:24 am 
Offline
User avatar

Joined: Wed May 22, 2013 12:02 am
Posts: 20
Location: The Netherlands
I am trying to load my kernel with grub. Grub tells me that it found an unrecognized tag(0x18). This is the assembly file with my header:
Code:
%include "multiboot2.inc"
BITS 32

section .multiboot
multiboot_header:
align MULTIBOOT_HEADER_ALIGN
    dd MULTIBOOT2_HEADER_MAGIC      ; magic
    dd MULTIBOOT_ARCHITECTURE_I386  ; architecture
    dd multiboot_header_end - multiboot_header
    dd -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_ARCHITECTURE_I386 + (multiboot_header_end - multiboot_header)) ; checksum
mbi_tag_start:
    dw MULTIBOOT_HEADER_TAG_INFORMATION_REQUEST ; type
    dw MULTIBOOT_HEADER_TAG_OPTIONAL            ; flags
    dd mbi_tag_end - mbi_tag_start
    dd MULTIBOOT_TAG_TYPE_CMDLINE
    dd MULTIBOOT_TAG_TYPE_MMAP
    dd MULTIBOOT_TAG_TYPE_FRAMEBUFFER
mbi_tag_end:
address_tag_start:
    dw MULTIBOOT_HEADER_TAG_ADDRESS         ; type
    dw MULTIBOOT_HEADER_TAG_OPTIONAL        ; flags
    dd address_tag_end - address_tag_start  ; size
    dd multiboot_header                     ; header address
    dd text_start                           ; load address
    dd text_end                             ; load end address
    dd bss_end                              ; bss end address
address_tag_end:
entry_address_tag_start:
    dw MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS               ; type
    dw MULTIBOOT_HEADER_TAG_OPTIONAL                    ; flags
    dd entry_address_tag_end - entry_address_tag_start  ; size
    dd _start
entry_address_tag_end:
framebuffer_tag_start:
    dw MULTIBOOT_HEADER_TAG_FRAMEBUFFER ; type
    dw MULTIBOOT_HEADER_TAG_OPTIONAL    ; flags
    dd 1024                             ; width
    dd 720                              ; height
    dd 32                               ; depth
framebuffer_tag_end: ; I can't find this in the documentation :/
    dw MULTIBOOT_HEADER_TAG_END
    dw 0
    dd 8
multiboot_header_end:

section .text
text_start:
global _start
_start:
    cli
    mov esp, stack_top   ; Set stack pointer
    mov ebp, stack_top   ; Set stack base
    lgdt [gdt_ptr]
    push ebx    ; Push pointer to multiboot info
    push eax    ; Push magic value
    extern main32
    call main32

    ; Kernel ended somehow
loop:
    hlt
    jmp loop
gdt:
    ; null descriptor
    dd 0
    dd 0

    ; code descriptor
    dw 0FFFFh   ; limit low
    dw 0        ; base low
    db 0        ; base middle
    db 10011010b; access
    db 11001111b; granularity
    db 0        ; base high

    ; data descriptor
    dw 0FFFFh   ; limit low
    dw 0        ; base low
    db 0        ; base middle
    db 10010010b; access
    db 11001111b; granularity
    db 0        ; base high
end_of_gdt:
gdt_ptr:
    dw end_of_gdt - gdt - 1 ; limit (Size of GDT)
    dd gdt
text_end:

section .bootstrap_stack, nobits
bss_start:
align 4
stack_bottom:
resb 16384
stack_top:
bss_end:

NASM is giving me a warning when I assemble the file that says that the checksum value is too high for dd. I don't know if that is related but I get the feeling it might be.
While looking at the produced binary file in a hex editor I've come to the conclusion that the value 0x18 is actually the size specified in the address tag.
I have annotated what the hex editor showed me, I would appreciate it if you were tell me if I made any mistakes:
Image

My linker.ld:
Code:
ENTRY(_start)

SECTIONS
{
    . = 1M;

    .text BLOCK(4K) : ALIGN(4K)
    {
        *(.multiboot)
        *(.text)
    }

    .rodata BLOCK(4K) : ALIGN(4K)
    {
        *(.rodata)
    }

    .data BLOCK(4K) : ALIGN(4K)
    {
        *(.data)
    }

    .bss BLOCK(4K) : ALIGN(4K)
    {
        *(COMMON)
        *(.bss)
        *(.bootstrap_stack)
    }
}

I am assembling and linking like this:
Code:
nasm -f elf -isrc/headers/ src/kernel/arch/i686/boot.asm -o build/kernel/arch/i686/boot.o
/* A bunch c files are compiled inbetween */
i686-elf-gcc -T linker.ld -o build/isodir/boot/myos.bin -ffreestanding -O2 -nostdlib /* the object files compiled from the c code */ build/kernel/arch/i686/boot.o -lgcc


I've probably made a really obvious mistake and I hope you can find it because couldn't.


Top
 Profile  
 
 Post subject: Re: Multiboot2 header: unrecognized tag
PostPosted: Sat May 12, 2018 1:12 pm 
Offline
Member
Member
User avatar

Joined: Sat Mar 31, 2012 3:07 am
Posts: 4591
Location: Chichester, UK
From the Multiboot 2 specification:

"Tags constitutes a buffer of structures following each other padded when necessary in order for each tag to start at 8-bytes aligned address."

Your second tag isn't aligned.


Top
 Profile  
 
 Post subject: Re: Multiboot2 header: unrecognized tag
PostPosted: Sun May 13, 2018 3:14 am 
Offline
User avatar

Joined: Wed May 22, 2013 12:02 am
Posts: 20
Location: The Netherlands
I had tried aligning all the header tags but I hadn't thought of aligning the mbi tags as well. Thank you this fixed the issue. I fixed the warning NASM was giving me by changing this:
Code:
    dd -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_ARCHITECTURE_I386 + (multiboot_header_end - multiboot_header))

into this:
Code:
    dd 0x100000000-(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_ARCHITECTURE_I386 + (multiboot_header_end - multiboot_header))


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 3 posts ] 

All times are UTC - 6 hours


Who is online

Users browsing this forum: Bing [Bot], Majestic-12 [Bot], SemrushBot [Bot] and 59 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group