C++Kernel



  • Hallo mein Bootloader ladet den Kernel nicht

    Bootloader:

    org 0x7C00 
    
    start:
                    ; Erst brauchen wir einen Stack.
    cli             ; Keine Interrupts!
    mov ax, 0x9000  ; Stackadresse
    mov ss, ax      ; SS = 9000 (unser Stack)
    mov sp, 0       ; SP = 0000  (der Stackpointer)
    sti             ; Interrupts zulassen
    
    mov [bootdrv], dl
    
    ;Lade unseren Kernel
    call load
    
    ;Springe zu diesem Kernel
    mov ax, 0x1000 ; Die Adresse des Programms
    mov es, ax     ; Segmentregister updaten
    mov ds, ax
    push ax
    mov ax, 0
    push ax
    retf
    
    ; ----------------------------------------------
    ; Funktionen und Variablen
    ; ----------------------------------------------
    
    bootdrv db 0 ;Das Bootlaufwerk
    loadmsg db "Lade MF OS 0.4...",13,10,0
    
    ; Einen String ausgeben:
    putstr:
    lodsb             ; Byte laden
    or al,al
    jz short putstrd  ; 0-Byte? -> Ende!
    
    mov ah,0x0E       ; Funktion 0x0E
    mov bx,0x0007     ; Attribut-Byte (wird nicht ben?t)
    int 0x10          ; schreiben
    jmp putstr        ; N?stes Byte
    putstrd:
    retn
    
    ; Lade den Kernel vom Bootlaufwerk
    load:
    
    ; Diskdrive reset (Interrupt 13h, 0)
    push ds            ; Sichere DS
    mov ax, 0          ; Die gew?e Funktion (reset)
    mov dl, [bootdrv]  ; Dieses Laufwerk ist gew?
    int 13h            ; Den Interrupt ausf?
    pop ds             ; DS wiederherstellen
    jc load            ; Geht nicht? -> Noch mal!
    
    ; Sektoren lesen (Interrupt 13h, 2)
    load1:
    mov ax,0x1000
    mov es,ax
    mov bx, 0
    mov ah, 2
    mov al, 5
    mov cx, 2
    mov dx, 0
    int 13h
    jc load1
    mov si,loadmsg 
    call putstr
    retn
    
    times 512-($-$$)-2 db 0   
    dw 0AA55h
    

    Der 1. Kernel

    mov ax, 1000h ; Segmentregister updaten
    mov ds, ax
    mov es, ax
    
    [BITS 16]				;16 Bit Code erstellen
    	jmp		start		;GDT überspringen
    
    NULL_Desc:
    	dd		0
    	dd		0
    
    CODE_Desc:
    	dw		0xFFFF		;Segmentgröße Byte 0/1
    	dw		0			;Segmentbasisadresse Byte 0/1
    	db		0			;Segmentbasisadresse Byte 2
    	db		10011010b	;Zugriffsberechtigungen
    	db		11001111b	;Zusatz + Segmentgröße Bits 16 - 19
    	db		0			;Segmentbasisadresse Byte 3
    
    DATA_Desc:
    	dw		0xFFFF
    	dw		0
    	db		0
    	db		0x92
    	db		0xCF
    	db		0
    
    gdt:
    Limit	dw	0			;Größe der GDT (wird später eingetragen)
    Base	dd	0			;Adresse der GDT (wird später eingetragen)
    
    start:					
    
    	cli					;Interrupts ausschalten
    
    	mov		eax, cs		;EAX auf derzeitiges Codesegment setzen
    	mov		ds, ax		;DS auf Codesegment setzen
    
    	shl		eax, 4				;EAX mit 16 multiplizieren (Lineare Adresse 
    								;des Codesegments errechnen)
    	mov		[CODE_Desc+2], ax	;Lineare Adresse des Codesegmentes als 
    	mov		[DATA_Desc+2], ax	;Startadresse des Code- und Datendeskriptors
    	shr		eax, 16				;eintragen
    	mov		[CODE_Desc+4], al
    	mov		[DATA_Desc+4], al
    
    	mov		eax, cs				;Startadresse der GDT errechnen
    	shl		eax, 4
    	add		eax, NULL_Desc
    
    	mov		[Base], eax			;Startadresse der GDT eintragen
    	mov		[Limit], WORD gdt - NULL_Desc -1	;Größe der GDT errechnen und eintragen
    
    	lgdt	[gdt]				;GDT laden
    
    	mov		eax, cr0			;In den Protected Mode schalten,
    	or		eax, 1				;indem Bit 0 des CR0 Registers auf 1
    	mov		cr0, eax			;gesetzt wird
    
    	db		0xea				;FAR-JUMP zum Codesegment
    	dw		PMODE
    	dw		0x8
    
    [BITS 32]						;32 Bit Code erstellen
    
    PMODE:
    	mov		WORD [CODE_Desc+2], 0	;Code Segmentstartaddresse auf 0 setzen
    	mov		WORD [DATA_Desc+2], 0	;Daten Segmentstartadresse auf 0 setzen
    	mov		BYTE [CODE_Desc+4], 0	;Code Segmentstartaddresse auf 0 setzen
    	mov		BYTE [DATA_Desc+4], 0	;Daten Segmentstartadresse auf 0 setzen
    
    	mov		eax, 2				;Selektor für das Datensegment erstellen
    	shl		eax, 3
    
    	mov		ds, ax				;Daten- Stack- und Extrasegment mit
    	mov		ss, ax				;Datensegmentdeskriptor laden
    	mov		es, ax
    	mov		eax, 0				;FS und GS mit Null-Deskriptor laden
    	mov		fs, ax
    	mov		gs, ax
    	mov		esp, 0x1FFFFF		;Stack auf unterhalb der 2 MB Grenze setzen
    
    	jmp		0x8:0x10000 + PMODE2	;Sprung in das "neue" Codesegment
    
    PMODE2:	
    	jmp		END						;Zum Ende Springen
    
    times 512-($-$$)	db	0;			;Da der Linker sich nicht mit ungeraden 
    									;Dateigrößen verträgt, wird diese Datei auf 512
    									;gepaddet.
    
    END:
    

    Der 2. Kernel

    [Bits 32]
    extern _main
    global start
    global _EnableA20Gate
    
    start:
    
    call _main
    
    STOP:
    	jmp STOP
    
    ;#######################################################################
    

    Der C+++ Kernel

    //a small C++ kernel
    #include <iostream>
    
    int main()
    {
        std::cout << "jawoll" << std::endl ;
        system("Pause");
        return 0 ;
    }
    


  • Du kansnt nicht einfach so die C++ Standardbibliothek benutzen! Das musst du schon selbst implementieren...



  • ja aber der 1. Kernel wird nicht geladen



  • Hi,
    vorallem system("Pause"); wird wohl nich gehen :p
    Was soll da denn aufgerufen werden?

    MfG
    AlexanderS



  • Der C++ Kernel ist nur Beispiel das Problem bereitet der Bootloader


Anmelden zum Antworten