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...


Anmelden zum Antworten