I need help with my c++ kernel..

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
EclipseOS

I need help with my c++ kernel..

Post by EclipseOS »

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
User avatar
Solar
Member
Member
Posts: 7615
Joined: Thu Nov 16, 2006 12:01 pm
Location: Germany
Contact:

Re:I need help with my c++ kernel..

Post by Solar »

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.
Every good solution is obvious once you've found it.
User avatar
Pype.Clicker
Member
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..

Post by Pype.Clicker »

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.
ineo

Re:I need help with my c++ kernel..

Post by ineo »

Solar 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.
No need to have a cross-compiler, the one you have is just enough if you're starting. I'm using it :)

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]
User avatar
Pype.Clicker
Member
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..

Post by Pype.Clicker »

but whyme's tutorial is Djgpp-specific concerning .ctor and .dtor sections ...
User avatar
Solar
Member
Member
Posts: 7615
Joined: Thu Nov 16, 2006 12:01 pm
Location: Germany
Contact:

Re:I need help with my c++ kernel..

Post by Solar »

@ 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.
Every good solution is obvious once you've found it.
User avatar
Pype.Clicker
Member
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..

Post by Pype.Clicker »

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:
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    
pini

Re:I need help with my c++ kernel..

Post by pini »

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.
EclipseOS

Re:I need help with my c++ kernel..

Post by EclipseOS »

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
User avatar
Neo
Member
Member
Posts: 842
Joined: Wed Oct 18, 2006 9:01 am

Re:I need help with my c++ kernel..

Post by Neo »

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]
Only Human
EclipseOS

Re:I need help with my c++ kernel..

Post by EclipseOS »

Thanx for the bootloader, I'll test it out. Man, I need to learn assembly! Looks good.
EclipseOS

Re:I need help with my c++ kernel..

Post by EclipseOS »

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.
User avatar
Solar
Member
Member
Posts: 7615
Joined: Thu Nov 16, 2006 12:01 pm
Location: Germany
Contact:

Re:I need help with my c++ kernel..

Post by Solar »

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?
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.

Welcome to kernel space. ;-)
Every good solution is obvious once you've found it.
ineo

Re:I need help with my c++ kernel..

Post by ineo »

@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
User avatar
Solar
Member
Member
Posts: 7615
Joined: Thu Nov 16, 2006 12:01 pm
Location: Germany
Contact:

Re:I need help with my c++ kernel..

Post by Solar »

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.
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)... ;-)
Every good solution is obvious once you've found it.
Post Reply