Page 1 of 1
mbchk
Posted: Thu Feb 28, 2002 3:05 am
by Whatever5k
I've created my kernel and tested it with mbchk, which said this:
kernel: The Multiboot header is found at the offset 0.
kernel: Page alignment is turned off.
kernel: Memory information is turned off.
kernel: Address fields is turned off.
kernel: All checks passed.
So everything seems fine. But when I want to load it with GRUB, it sais "unsupported or invalid executable format".
Why that?
My source files:
start.s:
;; start.s
;; The very beginning of GiPP. It creates the multiboot-header for GRUB
and then just loads the main C-function (kernel_main).
section .data
MULTIBOOT_HEADER_MAGIC equ 0x1BADB002
MULTIBOOT_HEADER_FLAGS equ 0x00000000
MULTIBOOT_HEADER_CHKSUM equ 0xE4524FF
section .text
global _start ; where the compiler jumps to...
extern kernel_main ; the C-function to jump to
_start:
;; build the multiboot header for GRUB
align 4
dd MULTIBOOT_HEADER_MAGIC
dd MULTIBOOT_HEADER_FLAGS
dd MULTIBOOT_HEADER_CHKSUM
CALL kernel_main
jmp $ ;halt
So it creates the Multiboot-header and calls the C-function... .
Here's the main.c:
/*main.c*/
int kernel_main(void); /*prototype*/
void write_string (int colour, char *string)
{
char *video=(char*)0xB8000;
while(*string!=0)
{
*video=*string;
string++;
video++;
*video=colour;
video++;
}
}
int kernel_main(void)
{
write_string (5, "hello, world");
while(1);
return 0;
}
Somebody knows what I'm still doing wrong?
Re: mbchk
Posted: Thu Feb 28, 2002 6:18 am
by K.J.
Did you output your kernel in ELF format?
K.J.
Re: mbchk
Posted: Fri Mar 01, 2002 1:35 am
by Whatever5k
No, I linked it to a binary:
nasm -f elf start.s
gcc -c main.c
ld -Ttext 0x100000 --oformat binary start.o main.o
Re: mbchk
Posted: Fri Mar 01, 2002 5:35 am
by K.J.
I'm not 100% sure about this, but I think that GRUB needs it to be and ELF.
K.J.
Re: mbchk
Posted: Fri Mar 01, 2002 4:58 pm
by Chris Giese
>kernel: Address fields is turned off.
This means that you are NOT using the aout kludge.
If the kernel is not ELF format, you must use the kludge.
'mbchk' doesn't check for this (:: sigh ::)
I am adding this to my GRUB ***** list (now up to 10 items)
Re: mbchk
Posted: Fri Mar 01, 2002 11:44 pm
by df
I am adding this to my GRUB ***** list (now up to 10 items)
now would be a good time to communicate that list to the grub guys. i know eric + yoshinori-san were going over doing a revised multiboot spec 0.7...
[email protected]
[email protected]
Re: mbchk
Posted: Sat Mar 02, 2002 1:25 am
by Whatever5k
Thanks, I linked it to elf and tried to boot it... .
Look at this, I've done the following steps:
root=(fd0)
kernel=(fd0)/kernel
boot
When I typed "kernel=(fd0)/kernel" GRUB said s.th. like this:
[Multiboot-elf] [0x0f244:3423] [0xa23d:3d] [start=0x100000]
The numbers are not right, but it looked s.th. like that.
Now I typed "boot" but GRUB said that the kernel has to be loaded before booting. But I just did it by typing "kernel=....".
So what's wrong?
Re: mbchk
Posted: Sat Mar 02, 2002 11:51 pm
by Whatever5k
I tried several things and that's what I found out. I build two slightly different kernels. They had the same asm file (start.s):
;; start.s
;; The very beginning of GiPP. It creates the multiboot-header for GRUB and then just loads the main C-function (kernel_main).
section .data
MULTIBOOT_HEADER_MAGIC equ 0x1BADB002
MULTIBOOT_HEADER_FLAGS equ 0x00000000
MULTIBOOT_HEADER_CHKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
section .text
global _start ; where the compiler jumps to...
extern kernel_main ; the C-function to jump to
_start:
;; build the multiboot header for GRUB
align 4
dd MULTIBOOT_HEADER_MAGIC
dd MULTIBOOT_HEADER_FLAGS
dd MULTIBOOT_HEADER_CHKSUM
jmp kernel_main
They differed in the C-file. Here's the version which works:
/*main.c*/
int kernel_main(void); /*prototype*/
int kernel_main(void)
{
char *video = (char*) 0xB8000;
*video = 'h';
*(video + 2) = 'i';
while(1); /*keep doing nothing*/
return 0;
}
If I compiled this C-file and linked it with the asm-file and booted it with GRUB, there was not this boot-error (it didn't put text on the screen, but this is not important for now). So this versions seems to work.
This is the version which did not work. It differs in the C-file:
/*main.c*/
int kernel_main(void); /*prototype*/
void write_string(int colour, char *string)
{
char *video=(char*)0xB8000;
while(*string!=0)
{
*video=*string;
string++;
video++;
*video=colour;
video++;
}
}
int kernel_main(void)
{
write_string(5, "hello, world");
while(1); /*keep doing nothing*/
return 0;
}
If I link this with the asm-file, GRUB cannot boot the kernel (it alway sais "kernel has to be loaded before booting", see above).
My question is: why can't GRUB load the version where there's a separate function for putting text on the screen?
Perhaps now somebody can help me.
regards,
A. Blessing
Re: mbchk
Posted: Sun Mar 03, 2002 2:27 am
by df
_start:
;; build the multiboot header for GRUB
align 4
dd MULTIBOOT_HEADER_MAGIC
dd MULTIBOOT_HEADER_FLAGS
dd MULTIBOOT_HEADER_CHKSUM
jmp kernel_main
err... you have DATA before CODE!
put the jmp kernel_main before the multiboot flags....
Re: mbchk
Posted: Sun Mar 03, 2002 4:02 am
by Whatever5k
Allright, it works... .
But why did the first version work (which also had the code before data)?
And my second question:
The kernel was supposed to ouput text. Well, after I typed "boot", my kernel started loading and did nothing but loop because of "while(1);". But it didn't ouput the "hello, world" text.
I wanted to halt my computer, but I clicked on the "save-energy-button" for pause. When I restarted the computer, the string "hello world" was put on the screen.
Why that?