Betriebssystem
-
Hallo, hier bin ich wieder Mal. Es hat alles super geklappt, den Kernel in C programmieren, ... . Aber ein Problem gibt es noch: Auf echter Hardware klappt das ganze nicht. Nur in Bochs. Ich weiß auch schon (ganz sicher) wo das Problem liegt, aber ich weiß nicht wie ich es beheben kann. Also:
Bootloader:
[BITS 16] org 7c00h jmp load start: cli ; Interrupts ausschalten lgdt [gdtr] ; GDT Pointer laden mov eax,cr0 ; In PMode wechseln, indem das niedrigste or al,1 ; Steuerungsbit von cr0 geändert wird mov cr0,eax ; muss über Umweg über ein anderes Register gemacht werden jmp codesel:PMode ;GENAU HIER LIEGT DAS PROBLEM, der Far-Jump schlägt fehl [BITS 32] PMode: mov ax,datasel ; Segmentregister laden mov ds,ax mov ss,ax mov es,ax mov ss,ax mov fs,ax mov gs,ax mov esp,0x90000 ; Stack aufsetzen jmp 10000h ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; == GDT == ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; [BITS 16] gdtr: ; Desktiptortabelle dw gdt_end-gdt-1 ; Limit dd gdt ; Basisadresse gdt: dd 0,0 ; Null-Deskriptor codesel equ $-gdt dw 0xFFFF ; Segmentgrösse 0..15 dw 0x0000 ; Segmentadresse 0..15 db 0x00 ; Segmentadresse 16..23 db 0x9A ; Zugriffsberechtigung und Typ db 0xCF ; Zusatzinformationen und Segmentgrösse 16...19 db 0x00 ; Segmentadresse 24..31 datasel equ $-gdt dw 0xFFFF ; Segmentgrösse 0..15 dw 0x0000 ; Segmentadresse 0..15 db 0x00 ; Segmentadresse 16..23 db 0x92 ; Zugriffsberechtigung und Typ db 0xCF ; Zusatzinformationen und Segmentgrösse 16...19 db 0x00 ; Segmentadresse 24..31 gdt_end: load: mov ah, 0h mov al, 3h int 10 mov ax, 9000h mov ss, ax mov sp, 0ffffh load2: ;das hab ich immer noch nicht kürzer angeschrieben xD mov ah, 02h ;fest mov al, 19h ;Anzahl mov ch, 00h ;Spur mov cl, 02h ;Sektor mov dh, 00h ;Kopf mov dl, 00h ;Laufwerksnummer mov bx, 0x1000 mov es, bx ;Segment mov bx, 0000h ;Offset int 13h jc load2 jmp start times 510-($-$$) db 0 signatur dw 0aa55h
-
Hallo,
gibt es auch ein Makefile dazu oder eine Build-Beschreibung, welche Tools verwendet, wie gebaut usw...
-
Natürlich, hatte ich ganz vergessen. Der Bootsector wird mit dem NASM assembliert, und mit dem Kernel durch die Windows Kopier-Funtkion zusammen "verschmolzen". (copy /b bootloader.asm+kernel.asm betriebssystem.bin). Und dann wird das ganze mit Rawwrite auf Diskette geschrieben. Ist das alles? Ich mache keine Angaben zum Kernel, weil der Fehler ja beim Far-Jump liegt...
-
Ich hatte es mir so vorgestellt, deinen geposteten Code mit "Copy-Paste" speichern, dann "make", danach fertige image-Datei mit bochs ausprobieren - alles nur aus reiner Neugier...