Hallo,
folgendes großes Problem beschäftigt mich nun schon seit mehreren Tagen.
Ich habe meine Bootloader.bin, diese sollte die Dateien kernel.bin und ckernel.bin in den Speicher schreiben damit ich diese später mit jmp erreichen kann, dass macht der auch noch bis zur kernel.bin und gibt dort noch seinen Text aus doch gleich danach wo der Befehl "jmp 08h:01000h" oder auch "jmp 0x1000" steht bricht er ab, also er resetet, ich weiß nicht wiso, er müsste doch eigentlich zur ckernel.bin springen und den code dort ausführen doch das macht er nicht. Ich habe euch mal meine bootloader.bin und meine kernel.bin sowie mein makefile angehängt.
Der ckernel mit seinen zugehörigen includes funktioniert, habe ich bereits getestet doch mit meinem loader und meinem kernel gibts probleme, wenn mir jemand helfen könnte und mir den code abändern könnte wäre ich sehr dankbar.
bootloader.bin:
start:
cli
mov ax, 0x9000
mov ss, ax
mov sp, 0
sti
mov [bootdrv], dl
call kernel
mov ax, 0x1000
mov es, ax
mov ds, ax
push ax
mov ax,0
push ax
retf
bootdrv db 0
loadmsg db "Loading...",13,10,0
putstr:
lodsb
or al, al
jz short putstrd
mov ah, 0x0E
mov bx,0x0007
int 0x10
jmp putstr
putstrd:
retn
kernel:
push ds
mov ax, 0
mov dl, [bootdrv]
int 13h
pop ds
jc kernel
load:
mov ax,0x1000
mov es, ax
mov bx,0
mov ah, 2
mov al, 5
mov cx, 2
mov dx, 0
int 13h
jc load
mov si, loadmsg
call putstr
retn
times 512-($-$$)-2 db 0
dw 0AA55h
kernel.bin
org 0x10000
[BITS 16] ; We need 16-bit intructions for Real mode
cli ; Disable interrupts, we want to be alone
mov ax, 0x1000
mov ds, ax ; Set DS-register to 0 - used by lgdt
lgdt [gdt_desc] ; Load the GDT descriptor
mov eax, cr0 ; Copy the contents of CR0 into EAX
or eax, 1 ; Set bit 0
mov cr0, eax ; Copy the contents of EAX into CR0
jmp dword 08h:clear_pipe ; Jump to code segment, offset clear_pipe
[BITS 32] ; We now need 32-bit instructions
clear_pipe:
mov ax, 10h ; Save data segment identifyer
mov ds, ax ; Move a valid data segment into the data segment register
mov ss, ax ; Move a valid data segment into the stack segment register
mov esp, 090000h ; Move the stack pointer to 090000h
mov byte [ds:0B8000h], 'H' ; Move the ASCII-code of 'P' into first video memory
mov byte [ds:0B8001h], 1Bh ; Assign a color code
mov byte [ds:0B8002h], 'a'
mov byte [ds:0b8003h], 1Bh
mov byte [ds:0B8004h], 'l'
mov byte [ds:0b8005h], 1Bh
mov byte [ds:0B8006h], 'l'
mov byte [ds:0b8007h], 1Bh
mov byte [ds:0B8008h], 'o'
mov byte [ds:0b8009h], 1Bh
jmp 08h:01000h ; Der oben angesprochene jmp
;hang:
;jmp hang
gdt: ; Address for the GDT
gdt_null: ; Null Segment
dd 0
dd 0
gdt_code: ; Code segment, read/execute, nonconforming
dw 0FFFFh
dw 0
db 0
db 10011010b
db 11001111b
db 0
gdt_data: ; Data segment, read/write, expand down
dw 0FFFFh
dw 0
db 0
db 10010010b
db 11001111b
db 0
gdt_end: ; Used to calculate the size of the GDT
gdt_desc: ; The GDT descriptor
dw gdt_end - gdt - 1 ; Limit (size)
dd gdt ; Address of the GDT
make.bat
@echo off
nasm -f bin bootloader.asm -o bootloader.bin
nasm -f bin kernel.asm -o kernel.bin
gcc -ffreestanding -c main.c -o main.o
gcc -c video.c -o video.o
gcc -c ports.c -o ports.o
ld -e _main -Ttext 0x1000 -o kernel.o main.o video.o ports.o
ld -i -e _main -Ttext 0x1000 -o kernel.o main.o video.o ports.o
objcopy -R .note -R .comment -S -O binary kernel.o ckernel.bin
copy bootloader.bin+kernel.bin+ckernel.bin os.img
Edit:
wenns jemanden hilft hier noch der ckernel (ohne seine includes):
const char *text1;
void main()
{
clrscr();
print(text1);
for(;;);
}
const char *text1 = "Hallo, Willkommen in C";