I need help with my c++ kernel..
I need help with my c++ kernel..
Hey
I am new to OS Development and I read almost all tutorials and docs that I can find on the internet about it. I have found one tutorial called "Writing a kernel in C++". It sounded great to me but I went through it and I couldn't get the kernel to boot. I am using Mandrake Linux 10, G++ compiler, NASM compiler, and ld Linker. When I just straight copy and paste the code that I am givin, then I try to link it and it says "in loader.o - undefined refence to _main". So I edited loader.asm and changed [extern _main] and call _main to [extern main] and call main, and it gets rid of this error, but I still can't get it to boot. I've tried grub but it just says "unsupported executable format" . Please could someone figure out what is going on. Thanx
I am new to OS Development and I read almost all tutorials and docs that I can find on the internet about it. I have found one tutorial called "Writing a kernel in C++". It sounded great to me but I went through it and I couldn't get the kernel to boot. I am using Mandrake Linux 10, G++ compiler, NASM compiler, and ld Linker. When I just straight copy and paste the code that I am givin, then I try to link it and it says "in loader.o - undefined refence to _main". So I edited loader.asm and changed [extern _main] and call _main to [extern main] and call main, and it gets rid of this error, but I still can't get it to boot. I've tried grub but it just says "unsupported executable format" . Please could someone figure out what is going on. Thanx
Re:I need help with my c++ kernel..
I'd strongly advise building a dedicated cross-compiler instead of using the stock one shipped with your distro. Gets you around a shipload of similar issues.
A how-to on building a cross-compiler is in the FAQ.
A how-to on building a cross-compiler is in the FAQ.
Every good solution is obvious once you've found it.
- Pype.Clicker
- Member
- Posts: 5964
- Joined: Wed Oct 18, 2006 2:31 am
- Location: In a galaxy, far, far away
- Contact:
Re:I need help with my c++ kernel..
check you use the proper binary format (sounds like the tutorial is for ELF and you're using COFF).
I typed a nicer reply, but your **** website crashed my **** mozilla.
I typed a nicer reply, but your **** website crashed my **** mozilla.
Re:I need help with my c++ kernel..
No need to have a cross-compiler, the one you have is just enough if you're starting. I'm using itSolar wrote: I'd strongly advise building a dedicated cross-compiler instead of using the stock one shipped with your distro. Gets you around a shipload of similar issues.
I guess the tutorial you read was a bit old (I think I read the same some months ago). I suggest you look at http://www.invalidsoftware.net, subscribe to get the last version of the code. You will find a c++ dedicated forum there.
Good luck !
I-Neo
[attachment deleted by admin]
- Pype.Clicker
- Member
- Posts: 5964
- Joined: Wed Oct 18, 2006 2:31 am
- Location: In a galaxy, far, far away
- Contact:
Re:I need help with my c++ kernel..
but whyme's tutorial is Djgpp-specific concerning .ctor and .dtor sections ...
Re:I need help with my c++ kernel..
@ ineo:
Smart one. ;D invalidsoftware.net was my starting point, both for the code and the development toolchain. And after I got through the initial stages of confusion, I wrote the very tutorial in the OS FAQ here, and I do recommend building a cross-compiler...
Sure, you can set options to the linker or to objcpy or whatever trickery required to get the toolchain to produce what you want instead of what it defaults to.
But the advantage of setting up a cross-compiler is that the very same procedure is the same regardless of your platform and environment, you don't drag in any files from your dev environment (like, starting files, library headers etc.), and in the end you produce the same code as everybody else using the same approach, making further helping much easier.
That being said, of course it's your decision. All I wanted to say is that I had only minimal hassles once I had my dedicated OS compiler set up.
Smart one. ;D invalidsoftware.net was my starting point, both for the code and the development toolchain. And after I got through the initial stages of confusion, I wrote the very tutorial in the OS FAQ here, and I do recommend building a cross-compiler...
Sure, you can set options to the linker or to objcpy or whatever trickery required to get the toolchain to produce what you want instead of what it defaults to.
But the advantage of setting up a cross-compiler is that the very same procedure is the same regardless of your platform and environment, you don't drag in any files from your dev environment (like, starting files, library headers etc.), and in the end you produce the same code as everybody else using the same approach, making further helping much easier.
That being said, of course it's your decision. All I wanted to say is that I had only minimal hassles once I had my dedicated OS compiler set up.
Every good solution is obvious once you've found it.
- Pype.Clicker
- Member
- Posts: 5964
- Joined: Wed Oct 18, 2006 2:31 am
- Location: In a galaxy, far, far away
- Contact:
Re:I need help with my c++ kernel..
a few things that may help ...
1. g++ seems to have a -fabi-version=n option which allows the user to toggle between the now-standard gcc 3.x abi and the gcc-specific 2.9x.y abi (version = 0) it doesn't appear to offer any changes on my g++ version, though ...
2. using g++/3.3, the 'main() { Video vid; }' didn't generate any __builtin_delete() in kernel.o nor in video.o ... i'm using whyme's flags (but the compiler complains that -ffreestanding is not valid for C++)
3. putting Video object outside of main() added a .ctors section and several weird symbols:
1. g++ seems to have a -fabi-version=n option which allows the user to toggle between the now-standard gcc 3.x abi and the gcc-specific 2.9x.y abi (version = 0) it doesn't appear to offer any changes on my g++ version, though ...
2. using g++/3.3, the 'main() { Video vid; }' didn't generate any __builtin_delete() in kernel.o nor in video.o ... i'm using whyme's flags (but the compiler complains that -ffreestanding is not valid for C++)
3. putting Video object outside of main() added a .ctors section and several weird symbols:
0000002c l F .text 0000003e _Z41__static_initialization_and_destruction_0ii
0000006a l F .text 00000018 __tcf_0
00000082 l F .text 0000001a _GLOBAL__I_vid
00000000 l d .ctors 00000000
0000000 *UND* 00000000 _ZN5Video5writeEPc
00000000 *UND* 00000000 _ZN5VideoC1Ev
00000000 *UND* 00000000 __dso_handle
00000000 *UND* 00000000 __cxa_atexit
00000000 *UND* 00000000 _ZN5VideoD1Ev
Code: Select all
0000002c <_Z41__static_initialization_and_destruction_0ii>:
2c: 55 push %ebp
2d: 89 e5 mov %esp,%ebp
2f: 83 ec 08 sub $0x8,%esp
32: 81 7d 0c ff ff 00 00 cmpl $0xffff,0xc(%ebp)
39: 75 2d jne 68 <_Z41__static_initialization_and_destr
uction_0ii+0x3c>
3b: 83 7d 08 01 cmpl $0x1,0x8(%ebp)
3f: 75 27 jne 68 <_Z41__static_initialization_and_destr
uction_0ii+0x3c>
41: 83 ec 0c sub $0xc,%esp
44: 68 00 00 00 00 push $0x0
45: R_386_32 vid
49: e8 fc ff ff ff call 4a <_Z41__static_initialization_and_destr
uction_0ii+0x1e>
4a: R_386_PC32 _ZN5VideoC1Ev
4e: 83 c4 10 add $0x10,%esp
51: 83 ec 04 sub $0x4,%esp
54: 68 00 00 00 00 push $0x0
55: R_386_32 __dso_handle
59: 6a 00 push $0x0
5b: 68 6a 00 00 00 push $0x6a
5c: R_386_32 .text
60: e8 fc ff ff ff call 61 <_Z41__static_initialization_and_destr
uction_0ii+0x35>
61: R_386_PC32 __cxa_atexit
65: 83 c4 10 add $0x10,%esp
68: c9 leave
69: c3 ret
Re:I need help with my c++ kernel..
one need to set the three "multiboot" fields in order to boot with grub.
I'm currently at work, so I can't give them right here, but googling about multiboot should give the answer.
When I added these fields to my kernel, I was able to boot with grub without making any other change.
I'm currently at work, so I can't give them right here, but googling about multiboot should give the answer.
When I added these fields to my kernel, I was able to boot with grub without making any other change.
Re:I need help with my c++ kernel..
Thanx for all your help guys, I finially got it working. What I did was add a multiboot header to the loader.asm file, then change the link.ld output format to elf32-i386 and it works fine with GRUB. But there should also be a way to do it in a flat binary. (Not with GRUB). Could someone show a good bootloader that will load my flat binary? Another problem taht I have is getting things like cout, cin, endl, ect.. Any ideas?
Thanx
Thanx
Re:I need help with my c++ kernel..
I wrote a simple bootloader in NASM for a flat binary kernel. The link to the primary is here and the secondary stage is attached here. Hope you find them useful.
<edit>
The secondary is actually named boot2.asm which assembles to boot2.bin as this is the file the primary searches for(you could change this). I renamed the file here because i couldn't attach it with that name here</edit>
[attachment deleted by admin]
<edit>
The secondary is actually named boot2.asm which assembles to boot2.bin as this is the file the primary searches for(you could change this). I renamed the file here because i couldn't attach it with that name here</edit>
[attachment deleted by admin]
Only Human
Re:I need help with my c++ kernel..
Thanx for the bootloader, I'll test it out. Man, I need to learn assembly! Looks good.
Re:I need help with my c++ kernel..
OK.
I got it to boot as a flat binary under Neo's bootloader. But now I'm not sure how to get standard fuctions like cout, endl, cin, ect.. Could someone show me how I could get these into my kernel? Thanx for the help before.
I got it to boot as a flat binary under Neo's bootloader. But now I'm not sure how to get standard fuctions like cout, endl, cin, ect.. Could someone show me how I could get these into my kernel? Thanx for the help before.
Re:I need help with my c++ kernel..
You either have to implement your own standard libraries, or port existing ones (e.g. glibc, newlib). Existing ones depend on certain OS primitives like open(), close(), write(), sbrk() etc. for their standard functions fopen(), fclose(), fwrite(), malloc() etc. to function.EclipseOS wrote: But now I'm not sure how to get standard fuctions like cout, endl, cin, ect.. Could someone show me how I could get these into my kernel?
Welcome to kernel space.
Every good solution is obvious once you've found it.
Re:I need help with my c++ kernel..
@Solar
Well I agree with what you said about the cross-compiler & toolchain, however I think it is not really pedagogic to start from.
Once you have played with your kernel and you want to go to the next step, it seems obvious that a cross-compiler is needed.
I'll have a look at your tutorial as I'm interested in it too ;D
I-Neo
Well I agree with what you said about the cross-compiler & toolchain, however I think it is not really pedagogic to start from.
Once you have played with your kernel and you want to go to the next step, it seems obvious that a cross-compiler is needed.
I'll have a look at your tutorial as I'm interested in it too ;D
I-Neo
Re:I need help with my c++ kernel..
I'm not sure what you mean with "pedagogic", but for me it was a necessity since I was working with Cygwin at that time (which produces PE binaries by default when I wanted ELF ones)...ineo wrote: @Solar
Well I agree with what you said about the cross-compiler & toolchain, however I think it is not really pedagogic to start from.
Every good solution is obvious once you've found it.