Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: jeb am 16. June 2005, 12:04

Titel: Linken nicht möglich
Beitrag von: jeb 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.
Titel: Re: Linken nicht möglich
Beitrag von: matthieuriolo am 16. June 2005, 12:16
sollte [bits 32] nicht am anfang sein? Vorallem was versuchst da noch in der asm datei zu machen?
Titel: Linken nicht möglich
Beitrag von: jeb 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).
Titel: Linken nicht möglich
Beitrag von: Legend am 16. June 2005, 13:43
Tja, in so einem Falle muss man per cli/hlt die Zeile die fehlschlägt suchen ...
Titel: Linken nicht möglich
Beitrag von: jeb 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.
Titel: Linken nicht möglich
Beitrag von: GhostCoder am 16. June 2005, 22:55
Hi,

ist ESP bzw. SS richtig gesetzt?

Gruß GhostCoder
Titel: Linken nicht möglich
Beitrag von: Roshl am 17. June 2005, 15:42
Ich denke auch der Stack haut nicht hin, sehe nicht, dass da irgendwas initialisiert wird.
Titel: Linken nicht möglich
Beitrag von: jeb 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).
Titel: Linken nicht möglich
Beitrag von: jeb 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
Titel: Linken nicht möglich
Beitrag von: jeb 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
Titel: Linken nicht möglich
Beitrag von: jeb 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
Titel: Linken nicht möglich
Beitrag von: Golum 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.
Titel: Linken nicht möglich
Beitrag von: jeb 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.
Titel: Linken nicht möglich
Beitrag von: Golum am 21. June 2005, 21:28
Und wo ^^
Titel: Linken nicht möglich
Beitrag von: SSJ7Gohan am 21. June 2005, 21:40
http://jeremiasherlock.je.funpic.de/kernel.gz
Titel: Linken nicht möglich
Beitrag von: jeb am 21. June 2005, 21:54
bzw. die gleiche seite
Titel: Linken nicht möglich
Beitrag von: jeb am 24. June 2005, 12:16
bitte!
Titel: Linken nicht möglich
Beitrag von: jeb am 26. June 2005, 17:08
wollt ihr mich zwingen, auf zu hören :?
Titel: Linken nicht möglich
Beitrag von: Golum 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.
Titel: Linken nicht möglich
Beitrag von: jeb am 26. June 2005, 21:08
endlich.

DANKE :P
Titel: Linken nicht möglich
Beitrag von: jeb am 28. June 2005, 15:11
ich will euch ja nicht nerven aber.....

HAT DENN KEINER 30 MIN ZEIT FÜR MICH?
Titel: Linken nicht möglich
Beitrag von: xormore am 28. June 2005, 15:43
also ich halte den code für bockmist (<-- spektogeiles wort übrigens). mir stellen sich da nämlich ein paar fragen:

- warum nutzt du nicht grub als bootloader? ist einfacher und du hättest diese probleme nicht

- warum patcht du die selektoren? welchen vorteil hast du davon? (nicht unbedingt an dich gerichtet: und wer verdammt nochmal hat mit diesem scheiss angefangen? und warum machen es ihm alle nach?) das macht den code bloß zu einem frickelwerk, das fehleranfälliger nicht sein könnte z.b. patcht du die gdt, aber lädst sie nicht neu (zwischen PMODE und PMODE2)

- und was soll das sein?
db 0xea
dw PMODE
dw 0x8

warum schreibst du nicht einfach jmp word 0x08:PMODE?
(und auch hier: wer hat mit diesem blödsinn angefangen? ich verdächtige da MASM/TASM programmierer ... tja jungs, den falschen assembler gewählt!)

- warum springst du in 2 stufen in den protected mode?

- du lädst selektoren mit dem null selektor. warum? bist sicher das das gut geht?

- noch was kosmetisches:
mov eax,2
shl eax,3

warum nicht so?
mov eax, 2 * 8
Titel: Linken nicht möglich
Beitrag von: jeb am 29. June 2005, 20:51
der Code ist von TeeJay, ausm tutorial
Titel: Linken nicht möglich
Beitrag von: Roshl am 30. June 2005, 10:57
Ja das mit dem selbstcodieren das farjumps und des 2stufigen pmode aktivierens kommt von TJ. Grund: er wusste nicht, wie man das anders machen konnte^^
Titel: Linken nicht möglich
Beitrag von: jeb am 30. June 2005, 11:14
aber ich denke das ist nicht der grund weshalb de stack (bin mir fast sicher das es er ist) nicht funktioniert
Titel: Linken nicht möglich
Beitrag von: jeb am 15. July 2005, 21:25
was meint ihr mit 2-stufen-pm-jump?
Titel: Linken nicht möglich
Beitrag von: xormore am 16. July 2005, 02:24
ich mein damit, das hier:

1. stufe:
db 0xea
dw PMODE
dw 0x8


2. stufe:
jmp 0x8:0x10000 + PMODE2
Titel: Linken nicht möglich
Beitrag von: jeb am 18. July 2005, 19:53
und was wäre der Verbesserungsvorschlag?
Titel: Linken nicht möglich
Beitrag von: xormore am 18. July 2005, 20:10
Zitat von: xormore
- warum nutzt du nicht grub als bootloader? ist einfacher und du hättest diese probleme nicht