Autor Thema: GDT haut alles durcheinander  (Gelesen 6137 mal)

Beatkiller

  • Beiträge: 17
    • Profil anzeigen
Gespeichert
« am: 27. July 2005, 16:36 »
Anscheinen hab ich ein kleineres Problem. Dummerweise weiß nicht nicht genau, ob es ein etwas größeres is, ich verlass mich da auf mein Gefühl.

Nachdem ich einen C++-Kernel Grub-Kompatible gebaut habe, wollte ich nun  GDT und IDT implementieren. Bleibe aber hängen, weil der nasm den .text-Part anscheinend an eine falsch Stelle schreibt:

Loader.o(.text+0x2c):Loader.o: relocation truncated to fit: 16 against `.text'
Loader.o(.text+0x2f):Loader.o: relocation truncated to fit: 16 against `.text'
Loader.o(.text+0x36):Loader.o: relocation truncated to fit: 16 against `.text'
Loader.o(.text+0x39):Loader.o: relocation truncated to fit: 16 against `.text'
Loader.o(.text+0x4a):Loader.o: relocation truncated to fit: 16 against `.text'
Loader.o(.text+0x4e):Loader.o: relocation truncated to fit: 16 against `.text'
Loader.o(.text+0x55):Loader.o: relocation truncated to fit: 16 against `.text'
Loader.o(.text+0x64):Loader.o: relocation truncated to fit: 16 against `.text'


Ich weiß nun nicht genau, was das zu bedeuten hat, und wie ich es löse. Kann mir da jemand auf die Sprünge helfen?

__OS_coder

  • Beiträge: 69
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 27. July 2005, 17:19 »
hi,
Ich würd' ma sagen das ist nich NASM,
da stimmt was mit deinem Linkerscript nich...
Sicher bin ich mir da abba nich...

Poste ma den Kernel und das Script...

xormore

  • Beiträge: 25
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 31. July 2005, 18:47 »
ich schätze, dass liegt daran, dass du ausversehen 16bit und 32bit code mischt, oder irgendwelche 16bit breiten offsets (dw offset, statt dd offset) in 32bit code verwendest.

Beatkiller

  • Beiträge: 17
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 19. October 2005, 15:45 »
Stimmt, ich mische anscheinend 16Bit mit 32Bit. Mein Verständnis-Problem liegt im PM-Tutorial.

Ich möchte den Teil des 16-Bit-Kernels als Object linken nicht als Binär-Datei ausgeben.

Ich hab das Assembler (von dem ich noch einiges lernen muss) um ein paar Sachen ergänzt und etwas raus genommen. Das END ist gegen start ausgetauscht worden und start global angelegt.

Im start-Teil wird _main, main und _atexit aufgerufen, so dass ich die Features von C++ nutzen kann - was aber anscheinend nicht zum laufen zu Bewegen ist.

Meine Frage nun an dieser Stelle:

1. Wie muss ich den Assembler anpassen, das es den 16Bit-Code des GDT nutzen kann, ohne ein Bin zu erstellen.
2. Kann ich GRUB dazu verwenden, einen GDT und evtl eine IDT zu laden? Weil Grub für sich ja schon den Protected Mode zur Verfügung stellt.

Grüße und danke für eure Antworten
Beat

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 19. October 2005, 16:00 »
Eine GDT läd GRUB automatisch, mit einen 32 Bit Code und Datensegment, die jeweils von 0x0 bis 0xFFFFFFFF gehen.
Eine IDT musst du selbst laden.

Für GRUB brauchst du eigentlich garkeinen 16 Bit Code. Ich nehme an du verwendest ELF als Format, ELF kann keine 16 und 32 Bit mischen, da überall 32 Bit Offsets angegeben werden müssen (auch bei Relocations).

Beatkiller

  • Beiträge: 17
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 19. October 2005, 16:08 »
Danke, hat sich schon erledigt, ich hab ein genuöses Dokument gefunden:

http://www.osdever.net/bkerndev/Docs/basickernel.htm

 

Einloggen