Hallo,
ich schreib auch grad an meinem eigenen Betriebssystem
es setzt sich aus einem Bootloader (16Bit Assembler) einem Kernel (16Bit Assembler) und einem 2.Kernel (16Bit C) zusammen (soll es jedenfalls mal...)
Den C-Teil könnt ihr euch komplett wegdenken, den gibt es noch nicht
das erwähne ich nur, da ich mal einen C-Teil mit einbauen will und deswegen ld benutzen muss um den Assembler-Kernel zu linken und ihn nicht einfach mit nasm direkt in flat binary umwandeln kann
(als ich den bootloader und den Asm-Kernel mit nasm direkt zu flat-binary gemacht hab, hat übrigens alles problemlos funktioniert)
Mein Problem ist nun folgendes:
der Bootloader funktioniert ohne Probleme
der Assembler-Kernel funktioniert eigentlich auch, außer man greift auf eine festgelegte Adresse zu
(damit meine ich z.B.: 'bsp db "beispiel",0')
sobald man da smacht stürzt das ganze ab
als ichs dann mal in Blochs ausprobiert hab, sagt der:
">>PANIC<< prefetch: RIP > CS:limit"
aus der Meldung, die ja soviel heißt wie "ungültiger Speicherzugriff" und der Tatsache, dass es ohne die o.g. festgelegten Adressen funktioniert, schließe ich das irgendwas mit den Segmenten falsch eingestellt ist
wahrscheinlich im Linker-Script von ld, welches ich ehrlich gesagt auch nur kopiert habe:
OUTPUT_FORMAT("binary")
INPUT(asmkernel.o)
ENTRY(start)
SECTIONS
{
.text 0x200 : {
code = .; _code = .; __code = .;
*(.text)
. = ALIGN(1);
}
.data : {
data = .; _data = .; __data = .;
*(.data)
. = ALIGN(1);
}
.bss :
{
bss = .; _bss = .; __bss = .;
*(.bss)
. = ALIGN(1);
}
end = .; _end = .; __end = .;
}
in der Zeile ".text 0x200 : {"
muss wahrscheinlich ein anderer Wert rein,
leider weiß ich nicht welcher
ich dachte es muss einfach 0x10000 rein,
da mein Kernel an die Adresse 1000:0000 geladen wird
(das komplette OS ist übrigens im Real-Mode)
aber das wollte ld nicht, dazu sagte er:
"relocation truncated to fit: 16 against `.text'"
und wenn ich den Wert weglasse ändert das auch nichts
immer der gleiche Fehler
hier noch der Quellcode vom Bootloader:
org 7c00h
jmp main
readbr:
mov ah, 02h ;fest
mov al, 01h ;Anzahl
mov ch, 00h ;Spur
mov cl, 02h ;Sektor
mov dh, 00h ;Kopf
mov dl, 00h ;Laufwerksnummer
mov bx, 1000h
mov es, bx ;Segment
mov bx, 0000h ;Offset
int 13h
ret
main:
call readbr
mov ax, 1000h
push ax
mov ax, 0000h
push ax
retf
int 19h
TIMES 510-($-$$) DB 0
SIGNATURE DW 0xAA55
und hier der vom Asm-Kernel:
text: ;Anfangsadresse in si übergeben
lodsb
cmp al, 00h
je texte
mov ah, 0Eh
mov bx, 0007h
int 10h
jmp text
texte:
ret
global start
start:
mov si, hello
call text
int 19h
hello db "Kernel started", 13, 10, 0
Ich hoffe ihr könnt mir helfen