Autor Thema: IDT funktioniert nicht  (Gelesen 23412 mal)

DaCodaaa

  • Gast
Gespeichert
« Antwort #40 am: 22. August 2009, 18:48 »
@taljeth
So kann man es zwar auch machen, aber der fehler lag daran, dass er interrupt routines immer gross geschrieben hatte.
Ausserdem ist mir gerade aufgefallen, dass der Compiler wohl erwartet, dass man ein Array daraus macht:
void *interrupt_routines[256];        (vielleicht sollte man es noch mit 0 initialisieren?)


void kann man nämlich mit allem beschreiben (ints,longs,chars und Funktionspointern), daher war es sicherlich nicht falsch, falsch war eher, das Fehlende Array.

@Pk3
Es wäre mit sicherheit besser, wenn du die IDT nicht im Kernel Code aufstellen würdest, sondern in einer anderen Datei und dann in einer header datei die Prototypen mit extern davor reinschreibst, welche dann im Kernel.c nutzbar wären.
« Letzte Änderung: 22. August 2009, 18:56 von DaCodaaa »

Pk3

  • Beiträge: 52
    • Profil anzeigen
    • Xyross
Gespeichert
« Antwort #41 am: 22. August 2009, 18:57 »
void *interrupt_routines[256]So gehts  :-).

Jetzt nurnoch ein Fehler, der kommt aber vom Linker:
C:\Users\Pk3\Desktop\C_Kernel\Interrupts.o: file not recognized: File format not
 recognized

Linker.ld
INPUT("C:\Users\Pk3\Desktop\C_Kernel\kernel.o")
INPUT("C:\Users\Pk3\Desktop\C_Kernel\Interrupts.o")
ENTRY(_begin)
SECTIONS
{
  .text  0x1000 :
  {
    *(.text)
    *(.rdata)
    *(.rodata*)
  }
  .data  :
  {
    *(.data)
  }
  .bss  :
  {
    *(.bss)
  }
}

Aufruf:
nasm -f elf -o Interrupts.o Interrupts.asm
C:\cygnus\cygwin-b20\H-i586-cygwin32\bin\ld -O 1 -T C:\Users\Pk3\Desktop\C_Kernel\link.ld -o C:\Users\Pk3\Desktop\C_Kernel\kernel.bin

DaCodaaa

  • Gast
Gespeichert
« Antwort #42 am: 22. August 2009, 19:03 »
Hier meine link.ld:

OUTPUT_FORMAT("binary")
INPUT(...)
INPUT(...)
OUTPUT(C:\MeinOS\Neon.ker)
OUTPUT(A:\NEON.ker)
ENTRY(initial)

phys = 0x00100000;

SECTIONS
{
  .text phys : AT(phys)
  {
    code = .;
    *(.text)
    *(.rodata)
    . = ALIGN(4096);
  }
  .data : AT(phys + (data - code))
  {
    data = .;
    *(.data)
    . = ALIGN(4096);
  }
  .bss : AT(phys + (bss - code))
  {
    bss = .;
    *(.bss)
    . = ALIGN(4096);
  }
  end = .;
}

Versuchs damit.
« Letzte Änderung: 22. August 2009, 19:06 von DaCodaaa »

Pk3

  • Beiträge: 52
    • Profil anzeigen
    • Xyross
Gespeichert
« Antwort #43 am: 22. August 2009, 19:10 »
Geht net, vielleicht liegts an NASM, also wie ich den Assembler Code komplimiert habe?

DaCodaaa

  • Gast
Gespeichert
« Antwort #44 am: 22. August 2009, 19:17 »
Also bei mir Funztz prima.
vlt neue ver. von nasm runterladen?

Pk3

  • Beiträge: 52
    • Profil anzeigen
    • Xyross
Gespeichert
« Antwort #45 am: 22. August 2009, 19:23 »
Ich hab NASM 2.07, welche hast du?

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #46 am: 22. August 2009, 19:24 »
Wenn du elf-Dateien erstellst, darfst du sie nicht mit dem cygwin ld linken. Erstell mit NASM die Dateien im Format win32 oder coff. Oder Wechsel zu einem Cross Compiler.
« Letzte Änderung: 22. August 2009, 19:28 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

Pk3

  • Beiträge: 52
    • Profil anzeigen
    • Xyross
Gespeichert
« Antwort #47 am: 22. August 2009, 19:34 »
Habs mit "coff" gemacht.
nasm -f coff -o Interrupts.o Interrupts.asm
Linker.ld
INPUT("C:\Users\Pk3\Desktop\C_Kernel\Interrupts.o")
INPUT("C:\Users\Pk3\Desktop\C_Kernel\kernel.o")
ENTRY(_begin)
SECTIONS
{
  .text  0x1000 :
  {
    *(.text)
    *(.rdata)
    *(.rodata*)
  }
  .data  :
  {
    *(.data)
  }
  .bss  :
  {
    *(.bss)
  }
}

make.bat
ECHO OFF
nasm -f bin -o boot.bin boot.asm
nasm -f coff -o Interrupts.o Interrupts.asm

cd C:
cd C:\cygnus\cygwin-b20\H-i586-cygwin32\bin\

echo Compiling Kernel...
D:\Programme\CodeBlocks\MinGW\Bin\gcc -O3 -ffreestanding -m32 -fleading-underscore -c -o C:\Users\Pk3\Desktop\C_Kernel\kernel.o C:\Users\Pk3\Desktop\C_Kernel\kernel.c
echo Linking...
C:\cygnus\cygwin-b20\H-i586-cygwin32\bin\ld -O 1 -T C:\Users\Pk3\Desktop\C_Kernel\link.ld -o C:\Users\Pk3\Desktop\C_Kernel\kernel.bin
echo Convert binary...
C:\cygnus\cygwin-b20\H-i586-cygwin32\bin\objcopy -O binary C:\Users\Pk3\Desktop\C_Kernel\kernel.bin
echo Make Image...
copy /b C:\Users\Pk3\Desktop\C_Kernel\boot.bin + C:\Users\Pk3\Desktop\C_Kernel\Interrupts.bin + C:\Users\Pk3\Desktop\C_Kernel\kernel.bin C:\Users\Pk3\Desktop\C_Kernel\os.img

xcopy C:\Users\Pk3\Desktop\C_Kernel\os.img D:\Programme\Bochs-2.3.5\os.img /Y

pause

C:\Users\Pk3\Desktop\C_Kernel\rawwritewin.exe C:\Users\Pk3\Desktop\C_Kernel\os.img a:


Meldungen:
C:\Users\Pk3\Desktop\C_Kernel\kernel.o(.text+0x1b7):kernel.c: undefined referenc
e to `outb'
C:\Users\Pk3\Desktop\C_Kernel\kernel.o(.text+0x1cc):kernel.c: undefined referenc
e to `outb'
C:\Users\Pk3\Desktop\C_Kernel\kernel.o(.text+0x1e1):kernel.c: undefined referenc
e to `outb'
C:\Users\Pk3\Desktop\C_Kernel\kernel.o(.text+0x1f6):kernel.c: undefined referenc
e to `outb'
C:\Users\Pk3\Desktop\C_Kernel\kernel.o(.text+0x20b):kernel.c: undefined referenc
e to `outb'
C:\Users\Pk3\Desktop\C_Kernel\kernel.o(.text+0x220):kernel.c: more undefined ref
erences to `outb' follow
C:\Users\Pk3\Desktop\C_Kernel\kernel.o(.text+0x2e6):kernel.c: undefined referenc
e to `intr1'
C:\Users\Pk3\Desktop\C_Kernel\kernel.o(.text+0x327):kernel.c: undefined referenc
e to `intr2'....

Irgentwie wird die Assembler - Datei (Interrupts.asm) nicht mit "kernel.c"
verknüpft....


Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #48 am: 22. August 2009, 19:49 »
Hast du outb irgendwo definiert?

Du musst außerdem wenn du einen Assembler/Compiler für Windows benutzt im Assemblercode immer Unterstriche vor die Symbole, die aus C sichtbar sind, setzen.
Dieser Text wird unter jedem Beitrag angezeigt.

Pk3

  • Beiträge: 52
    • Profil anzeigen
    • Xyross
Gespeichert
« Antwort #49 am: 22. August 2009, 19:52 »
"outb" ist nirgends im Assembler Code zu finden, aber "intr" schon.

Welche Symbole?
« Letzte Änderung: 22. August 2009, 20:07 von Pk3 »

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #50 am: 22. August 2009, 20:11 »
Symbole nennt man die Funktionsnamen, und Variablennamen.

Dann musst du eine Funktion outb schreiben. Oder du nimmst die Funktion aus dem Wiki:
static inline void outb(unsigned short port, unsigned char data)
{
    asm volatile ("outb %0, %1" : : "a" (data), "Nd" (port));
}
Dieser Text wird unter jedem Beitrag angezeigt.

Pk3

  • Beiträge: 52
    • Profil anzeigen
    • Xyross
Gespeichert
« Antwort #51 am: 22. August 2009, 20:26 »
Danke, das mit outb klappt jetzt  :-), nur das mit dem Unterstrich noch net  :-(.

Muss ich das so machen?

Interrupts.asm
intr_0
intr_1
intr_2
...
« Letzte Änderung: 22. August 2009, 20:29 von Pk3 »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #52 am: 22. August 2009, 20:27 »
Ausserdem ist mir gerade aufgefallen, dass der Compiler wohl erwartet, dass man ein Array daraus macht:
void *interrupt_routines[256];        (vielleicht sollte man es noch mit 0 initialisieren?)
Ja, der entscheidende Fehler ist, dass es kein Array war. Aber wenn ich nicht sehr danebenliege, funktioniert void* zwar mit gcc, ist aber eigentlich falsch.  Objektzeiger und Funktionszeiger sind zwei verschiedene Sachen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Pk3

  • Beiträge: 52
    • Profil anzeigen
    • Xyross
Gespeichert
« Antwort #53 am: 22. August 2009, 20:51 »
Es ist nur noch dieser Fehler, wenn der weg ist, klappts endlich.
Wo genau muss ich im Assembler Code die Unterstriche setzen?

DaCodaaa

  • Gast
Gespeichert
« Antwort #54 am: 22. August 2009, 21:08 »
Zitat
Du musst außerdem wenn du einen Assembler/Compiler für Windows benutzt im Assemblercode immer Unterstriche vor die Symbole, die aus C sichtbar sind, setzen.

bei mir funktionierts zwar ohne, aber probieren geht über studieren also:

in dem Fall müsstest du im C-code vor jedem intr ein _ setzen:

extern void _intr1();
...

auch beim späteren gebrauch musst du den Strich davor setzen:

idt_set_gate(1,(unsigned)_intr(),...

im asm-code musst du ebenfalls nach dem extern ein _ setzen:

extern _interrupt_handler

und:

...
call _interrupt_handler
...


Wie gesagt, ich brauchs auf win nicht, desshalb kann ich mir nicht so wirklich vorstellen, dass es bei dir klappt.
Du könntest auch gucken, was gcc und nasm mit deinen Symbolen machen. Dafür musst du mit einem Editor die o-Datei öffnen und nachschauen wie die Symbole da heissen.

Aber wir werden ganz bestimmt in Zukunft nicht mehr die ganze Arbeit für dich machen(ein bisschen must du ja auch selber schreiben). Ausserdem hab ich manchmal auch genug probleme mit meinem eigenen OS(momentan diese verdammte Tastatur :x), sodass ich wirklich nicht jedem seinen code aufräumen kann.
Die anderen sehen das bestimmt genauso.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #55 am: 22. August 2009, 21:13 »
In den C-Code müssen keine Unterstriche. Nur in den Assemblercode.
Dieser Text wird unter jedem Beitrag angezeigt.

DaCodaaa

  • Gast
Gespeichert
« Antwort #56 am: 22. August 2009, 21:18 »
Das verwirrt mich jetzt ein bisschen :|.

Warum sollten denn in den asm-code unterstriche vor den namen und im C-code nich???? :?

Macht etwa gcc Unterstriche vor die Symbole??

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #57 am: 22. August 2009, 21:21 »
Ja, unter Windows.
Dieser Text wird unter jedem Beitrag angezeigt.

Pk3

  • Beiträge: 52
    • Profil anzeigen
    • Xyross
Gespeichert
« Antwort #58 am: 22. August 2009, 21:22 »
Hab in der *.o Datei von Interrupts.asm nachgeschaut.
Nach dem ich in Interrupts.am vor jeder Variable ein _ habe
waren die in der *.o - Datei auch, und habe in kernel.o nachgeschaut
da waren die Unterstriche genauso, also müsste es passen.

DaCodaaa

  • Gast
Gespeichert
« Antwort #59 am: 22. August 2009, 21:26 »
@Pk3
Geile Seite hast du das alles alleine gemacht?
im Chat ist nur nich wirklich viel los...

Ich weiß ist offtopic. hoffe ihr verzeiht mir...
« Letzte Änderung: 22. August 2009, 21:31 von DaCodaaa »

 

Einloggen