Page 3 of 3

Re: linux versus multiboot in GRUB2

Posted: Mon Sep 27, 2021 9:59 am
by Princekin
I tried many times,and find the solution, just change 'multiboot_header' to:

Code: Select all

multiboot_header:
		/*  magic */
		.long   MULTIBOOT2_HEADER_MAGIC
		/*  ISA: i386 */
		.long   GRUB_MULTIBOOT_ARCHITECTURE_I386
		/*  Header length. */
		.long   multiboot_header_end - multiboot_header
		/*  checksum */
		.long   -(MULTIBOOT2_HEADER_MAGIC + GRUB_MULTIBOOT_ARCHITECTURE_I386 + (multiboot_header_end - multiboot_header))
		.long   0
		.long   8
here is all of my boot.S

Code: Select all

/*  boot.S - bootstrap the kernel */
/*  Copyright (C) 1999, 2001, 2010  Free Software Foundation, Inc.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#define ASM_FILE        1
#include "multiboot2.h"

/*  C symbol format. HAVE_ASM_USCORE is defined by configure. */
#ifdef HAVE_ASM_USCORE
# define EXT_C(sym)                     _ ## sym
#else
# define EXT_C(sym)                     sym
#endif

/*  The size of our stack (16KB). */
#define STACK_SIZE                      0x4000

/*  The flags for the Multiboot header. */
#ifdef __ELF__
# define AOUT_KLUDGE 0
#else
# define AOUT_KLUDGE MULTIBOOT_AOUT_KLUDGE
#endif
		
		.text

		.globl  start, _start
start:
_start:
		jmp     multiboot_entry

		/*  Align 64 bits boundary. */
		.align  8
		
		/*  Multiboot header. */
multiboot_header:
		/*  magic */
		.long   MULTIBOOT2_HEADER_MAGIC
		/*  ISA: i386 */
		.long   GRUB_MULTIBOOT_ARCHITECTURE_I386
		/*  Header length. */
		.long   multiboot_header_end - multiboot_header
		/*  checksum */
		.long   -(MULTIBOOT2_HEADER_MAGIC + GRUB_MULTIBOOT_ARCHITECTURE_I386 + (multiboot_header_end - multiboot_header))
		.long   0
		.long   8
#ifndef __ELF__
address_tag_start:      
		.short MULTIBOOT_HEADER_TAG_ADDRESS
		.short MULTIBOOT_HEADER_TAG_OPTIONAL
		.long address_tag_end - address_tag_start
		/*  header_addr */
		.long   multiboot_header
		/*  load_addr */
		.long   _start
		/*  load_end_addr */
		.long   _edata
		/*  bss_end_addr */
		.long   _end
address_tag_end:
entry_address_tag_start:        
		.short MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS
		.short MULTIBOOT_HEADER_TAG_OPTIONAL
		.long entry_address_tag_end - entry_address_tag_start
		/*  entry_addr */
		.long multiboot_entry
entry_address_tag_end:
#endif /*  __ELF__ */
framebuffer_tag_start:  
		.short MULTIBOOT_HEADER_TAG_FRAMEBUFFER
		.short MULTIBOOT_HEADER_TAG_OPTIONAL
		.long framebuffer_tag_end - framebuffer_tag_start
		.long 1024
		.long 768
		.long 32
framebuffer_tag_end:
		.short MULTIBOOT_HEADER_TAG_END
		.short 0
		.long 8
multiboot_header_end:
multiboot_entry:
		/*  Initialize the stack pointer. */
		movl    $(stack + STACK_SIZE), %esp

		/*  Reset EFLAGS. */
		pushl   $0
		popf

		/*  Push the pointer to the Multiboot information structure. */
		pushl   %ebx
		/*  Push the magic value. */
		pushl   %eax

		/*  Now enter the C main function... */
		call    EXT_C(cmain)

		/*  Halt. */
		pushl   $halt_message
		call    EXT_C(printf)
		
loop:   hlt
		jmp     loop

halt_message:
		.asciz  "Halted."

		/*  Our stack area. */
		.comm   stack, STACK_SIZE