Hallo,
ich bin mit meinem Kernel langsam an der Stelle angelangt, wo ich Programme starten möchte.
Ich hab mir nach einem Tutorial von osdev.org (
http://wiki.osdev.org/OS_Specific_Toolchain) einen Compiler mit Libc für mein OS gebaut. Das ganze funktioniert soweit recht gut, das Problem ist aber, dass beim Starten des Programms in der '__do_global_ctors_aux' Funktion (die wahrscheinlich vom GCC stammt) der Endmarker der .ctors Section nicht erkannt sondern ausgeführt wird. Das ganze resultiert in einer Invalid Opcode Exception (der Endmarker ist die Bytefolge 0xFFFFFFFF, was natürlich kein gültiger Opcode ist).
Hier ein paar Stücke aus dem Disassemblierten Programm:
Disassembly of section .init:
40000074 <.init>:
40000074: e8 77 00 00 00 call 400000f0 <frame_dummy>
40000079: e8 b2 2c 00 00 call 40002d30 <__do_global_ctors_aux>
Disassembly of section .text:
40000080 <_start>:
40000080: e8 cb 00 00 00 call 40000150 <main>
40000085: e8 c6 01 00 00 call 40000250 <_exit>
4000008a <.wait>:
4000008a: f4 hlt
4000008b: eb fd jmp 4000008a <.wait>
4000008d: 90 nop
4000008e: 90 nop
4000008f: 90 nop
40000150 <main>:
40000150: 8d 4c 24 04 lea 0x4(%esp),%ecx
40000154: 83 e4 f0 and $0xfffffff0,%esp
40000157: ff 71 fc pushl -0x4(%ecx)
4000015a: 55 push %ebp
4000015b: 89 e5 mov %esp,%ebp
4000015d: 51 push %ecx
4000015e: 83 ec 04 sub $0x4,%esp
40000161: 83 ec 0c sub $0xc,%esp
40000164: 68 78 2d 00 40 push $0x40002d78
40000169: e8 92 00 00 00 call 40000200 <puts>
4000016e: 83 c4 10 add $0x10,%esp
40000171: 8b 4d fc mov -0x4(%ebp),%ecx
40000174: c9 leave
40000175: 8d 61 fc lea -0x4(%ecx),%esp
40000178: c3 ret
40002d30 <__do_global_ctors_aux>:
40002d30: 55 push %ebp
40002d31: 89 e5 mov %esp,%ebp
40002d33: 56 push %esi
40002d34: 53 push %ebx
40002d35: e8 00 00 00 00 call 40002d3a <__do_global_ctors_aux+0xa>
40002d3a: 5b pop %ebx
40002d3b: 81 c3 ea 02 00 00 add $0x2ea,%ebx
40002d41: 8d 83 e4 ff ff ff lea -0x1c(%ebx),%eax
40002d47: 8d 50 fc lea -0x4(%eax),%edx
40002d4a: 8b 40 fc mov -0x4(%eax),%eax
40002d4d: 83 f8 ff cmp $0xffffffff,%eax
40002d50: 74 1b je 40002d6d <__do_global_ctors_aux+0x3d>
40002d52: 89 d6 mov %edx,%esi
40002d54: 8d b6 00 00 00 00 lea 0x0(%esi),%esi
40002d5a: 8d bf 00 00 00 00 lea 0x0(%edi),%edi
40002d60: ff d0 call *%eax
40002d62: 8b 46 fc mov -0x4(%esi),%eax
40002d65: 83 ee 04 sub $0x4,%esi
40002d68: 83 f8 ff cmp $0xffffffff,%eax
40002d6b: 75 f3 jne 40002d60 <__do_global_ctors_aux+0x30>
40002d6d: 5b pop %ebx
40002d6e: 5e pop %esi
40002d6f: 5d pop %ebp
40002d70: c3 ret
Disassembly of section .ctors:
40003004 <__CTOR_LIST__>:
40003004: ff (bad)
40003005: ff (bad)
40003006: ff (bad)
40003007: ff 00 incl (%eax)
40003008 <__CTOR_END__>:
40003008: 00 00 add %al,(%eax)
Der Einsprungspunkt ist 0x40000080, also die Adresse von '_start'. Was ich unter Anderem nicht verstehe: Warum wird die Funktion '__do_global_ctors_aux' überhaupt ausgeführt, und warum funktioniert der Test für den Endmarker (bei 0x40002d68) nicht?
Mein Loader sieht ca. so aus, wie der tyndur module loader.
Vielen vielen Dank schonmal im Vorraus,
Kuchen