Autor Thema: Linken nicht möglich  (Gelesen 15361 mal)

jeb

  • Beiträge: 341
    • Profil anzeigen
    • http://www.jebdev.net
Gespeichert
« am: 16. June 2005, 12:04 »
Was ist los? Nachdem ich nen endlich ASM und C++ mixen kann, robootet der Computer (nicht Bochs, das läuft ohne Probleme) immer, wenn der C++ Kernel aufgerufen wird. Das gleiche passiert auch mit dem C Kernel und externen ASM Funktionen. Wo liegt das Problem? Etwa doch am Linker? Auch bei anderen OS (ich erwähne mal wieder PiratOS) funktionieren in Bochs wunderbar aber nicht in Real!!

Hier die ASM Version:

;pm32.asm
[Bits 32]
extern _main
extern _jump
global start
start:
mov BYTE [0xB8000],0x4F
mov BYTE [0xB8000+1],7
mov BYTE [0xB8000+2],0x4B
mov BYTE [0xB8000+3],7
call _jump
Stop:
jmp Stop

;check_link.asm

[bits 32]
global _jump

_jump:
mov BYTE [0xB8000],0x4F
mov BYTE [0xB8000+1],16
mov BYTE [0xB8000+2],0x4B
mov BYTE [0xB8000+3],16
ret

//Linkfile

OUTPUT_FORMAT("binary")
INPUT(pm32.o check_link.o kernel.o video.o)
ENTRY(start)
SECTIONS
{
  .text 0x10200: {
    *(.text)
    . = ALIGN(1);
  }
  .data : {
    *(.data)
    . = ALIGN(1);
  }
  .bss :  {
    *(.bss)
    . = ALIGN(1);
  }
  end = .;_end = .;__end = .;
}


Fehlermeldungen gibts keine.

matthieuriolo

  • Beiträge: 226
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 16. June 2005, 12:16 »
sollte [bits 32] nicht am anfang sein? Vorallem was versuchst da noch in der asm datei zu machen?

jeb

  • Beiträge: 341
    • Profil anzeigen
    • http://www.jebdev.net
Gespeichert
« Antwort #2 am: 16. June 2005, 12:37 »
es sind 3 Dateien: pm32.asm, check_link.asm und link.txt
Eigentlich sollte pm32.asm den c++ kernel aufrufen, jedoch geht das nicht, ebenfalls nicht für asm. Das oben ist der Beispielcode den ich für ASM verwendet hab. Bits32 steht in jeder Datei am Anfang (hab die Dateien nicht gut abgegrenzt).

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #3 am: 16. June 2005, 13:43 »
Tja, in so einem Falle muss man per cli/hlt die Zeile die fehlschlägt suchen ...
*post*

jeb

  • Beiträge: 341
    • Profil anzeigen
    • http://www.jebdev.net
Gespeichert
« Antwort #4 am: 16. June 2005, 16:18 »
ich weiss wo der Fehler liegt. Ich kann ohne Probleme das andere Sourcefile mit asm aufrufen und es in einer Endlosschleife laufen lassen. Jedoch kommt der Fehler immer beim zurückspringen in die alte Datei.

[Bits 32]
extern _main
extern _jump
global start
start:
call _jump ; <--- Hier springe ich ins andere File. Alles klappt wunderbar
mov BYTE [0xB8000+4],0x4F
mov BYTE [0xB8000+5],7
mov BYTE [0xB8000+6],0x4B
mov BYTE [0xB8000+7],7
Stop
jmp Stop


[bits 32]
global _jump

_jump:
mov BYTE [0xB8000],0x4F
mov BYTE [0xB8000+1],16
mov BYTE [0xB8000+2],0x4B
mov BYTE [0xB8000+3],16
; jmp _jump
retn ; <---- Bis hier hin geht alles. Doch wenn ich den _jump Befehl oben lösche rebootet der Computer hier. Bochs macht alles normal. Weder ret noch retn funktioniert. Was muss ich für einen Jump ausführen (später auch in C++) um wieder ins alte Sourcefile zu gelangen?


Über ists der gleiche Fehler. Ich kann auch C++ Code ohne Probleme in einer Endlosschleife weiterlaufen lassen.

GhostCoder

  • Beiträge: 187
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 16. June 2005, 22:55 »
Hi,

ist ESP bzw. SS richtig gesetzt?

Gruß GhostCoder
A man, a legend!

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #6 am: 17. June 2005, 15:42 »
Ich denke auch der Stack haut nicht hin, sehe nicht, dass da irgendwas initialisiert wird.
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

jeb

  • Beiträge: 341
    • Profil anzeigen
    • http://www.jebdev.net
Gespeichert
« Antwort #7 am: 17. June 2005, 21:27 »
dann poste ich halt auch noch kernel16.asm:

[Bits 16]
jmp code_start
;----------------------------------------------
;---------------------Deskriptoren-------------
;----------------------------------------------
NULL_Desc:
dd 0
dd 0
CODE_Desc:
dw 0xFFFF
dw 0
db 0
db 0x9A
db 0xCF
db 0
DATA_Desc:
dw 0xFFFF
dw 0
db 0
db 0x92
db 0xCF
db 0
gdt:
Limit dw 0
Base dd 0
;----------------------------------------------
;---------------------Code Start---------------
;----------------------------------------------
code_start:

cli
mov eax,cs
mov ds,ax
;Deskriptor beginn auf 0x10000 setzten
shl eax,4
mov [CODE_Desc+2],ax
mov [DATA_Desc+2],ax
shr eax,16
mov [CODE_Desc+4],al
mov [DATA_Desc+4],al
;GDT eintragen
mov eax,cs
shl eax,4
add eax,NULL_Desc
mov [Base],eax
mov [Limit],WORD gdt - NULL_Desc - 1
lgdt [gdt]
;Start Protectdet Mode!
mov eax,cr0
or eax,1
mov cr0,eax

db 0xea
dw PMODE
dw 0x8
;----------------------------------------------
;-----------------Protected Mode---------------
;----------------------------------------------
[Bits 32]
PMODE:

mov WORD [CODE_Desc+2],0
mov WORD [DATA_Desc+2],0
mov BYTE [CODE_Desc+4],0
mov BYTE [DATA_Desc+4],0

mov eax,2
shl eax,3
mov ds,ax
mov ss,ax
mov es,ax

mov eax,0
mov fs,ax
mov gs,ax
mov esp,0x1FFFFF

jmp 0x8:0x10000 + PMODE2

PMODE2:
jmp END

times 512-($-$$) db 0

END:


Dachte wenn ihr [Bits32] seht könnt ihr euch schon denken dass ich bereits einen Stack im 16-Bit Code hatte. Oder muss ich den Stack neu initialisieren? Bei Bochs gehts ja auch so (ist ja auch nur ein Emulator).

jeb

  • Beiträge: 341
    • Profil anzeigen
    • http://www.jebdev.net
Gespeichert
« Antwort #8 am: 19. June 2005, 17:12 »
also bei folgendem code funktionierts auch nicht. Könnte es demnach doch am Stack liegen?

[Bits 32]
extern _main
global start
start:
;call _main
call my_func
mov BYTE [0xB8000+4],0x4F
mov BYTE [0xB8000+5],100
mov BYTE [0xB8000+6],0x4B
mov BYTE [0xB8000+7],100
jmp Stop

my_func:
ret
Stop
jmp Stop

jeb

  • Beiträge: 341
    • Profil anzeigen
    • http://www.jebdev.net
Gespeichert
« Antwort #9 am: 19. June 2005, 17:29 »
So jetzt hab ich mal meine Binaries und Sourcen in ein Zip-File gepackt. Ihr findet ihn hier: http://www.jeremia-baer.ch.vu

Probiert bitte folgendes aus:

Wie reagiert euer PC (in echt) auf meinen Kernel den ich compiliert hab?
Wie reagiert euer PC wenn ihr den Kernel selbst compiliert?

Ich würde mich freuen wenn jemand von euch sich bereit erklären würde, sich den Kernel mal an zu schaun resp. meine Binary zu booten. Vielleicht findet ihr ja den Fehler.

mfg, jeb

jeb

  • Beiträge: 341
    • Profil anzeigen
    • http://www.jebdev.net
Gespeichert
« Antwort #10 am: 21. June 2005, 15:08 »
kann es niemand machen? BITTE!!!!!!!!!!!!
Sonst müsste ich mein ganzes OS in ASM coden oder es sein lassen und das will ich eigentlich nicht. Es dauert doch höchstens eine halbe Stunde!!
BITTE!!!!!!

jeb

Golum

  • Beiträge: 96
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 21. June 2005, 15:36 »
Wie soll ich das compilieren ohne den C++ kernel ^^

Wenn du nen link mit nem netten .gz oder .tar file postest dann kann ich gern mal versuchen das zu compilieren  :wink:

Aber alles aus den Zitaten rauszukopieren und zu schaun was ich jetzt nehmen soll oder nicht will ich nicht.

jeb

  • Beiträge: 341
    • Profil anzeigen
    • http://www.jebdev.net
Gespeichert
« Antwort #12 am: 21. June 2005, 19:36 »
oh, die C++ objects hab ich vergessen raus zu hehmen. ich hab den kernel vorläufig auf ASM reduziert, da ja das auch noch nicht klappt. Ich schau mal noch wegen dem .gz file.

EDIT: Ok, das .gz file ist jetzt auch online.

Golum

  • Beiträge: 96
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 21. June 2005, 21:28 »
Und wo ^^

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 21. June 2005, 21:40 »

jeb

  • Beiträge: 341
    • Profil anzeigen
    • http://www.jebdev.net
Gespeichert
« Antwort #15 am: 21. June 2005, 21:54 »
bzw. die gleiche seite

jeb

  • Beiträge: 341
    • Profil anzeigen
    • http://www.jebdev.net
Gespeichert
« Antwort #16 am: 24. June 2005, 12:16 »
bitte!

jeb

  • Beiträge: 341
    • Profil anzeigen
    • http://www.jebdev.net
Gespeichert
« Antwort #17 am: 26. June 2005, 17:08 »
wollt ihr mich zwingen, auf zu hören :?

Golum

  • Beiträge: 96
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 26. June 2005, 17:24 »
Dein makefile passt nicht zum packet das du hochgeladen hast. Habe mir bis jetzt noch nicht die Zeit genommen ein eigenes zu erstellen :D
Werde mich heute oder morgen nochmal damit befassen.

jeb

  • Beiträge: 341
    • Profil anzeigen
    • http://www.jebdev.net
Gespeichert
« Antwort #19 am: 26. June 2005, 21:08 »
endlich.

DANKE :P

 

Einloggen