hi, ich habe mich gerade dran gemacht per Tutorial ein kleines os zu schreiben.
ich bin was asm angeht noch ein anfänger und arbeite mich da noch rein, heißt ich verstehe zwar den code habe aber noch probleme selber etwas in asm umzusetzen.
habe jetzt hier einen kleinen kernel (den asm teil) der in den Protected Mode umschaltet um dann in den C_kernel zu springen und Hello world auszugeben.
ohne das in den PMode springen funktioniert das auch. so wie ich den code jetzt aber aufgebaut habe bekomme ich beim zusammenlinken der kernel_asm.o und kernel_c.o diese fehlermeldung
das hier ist der asm kernel
ich bin was asm angeht noch ein anfänger und arbeite mich da noch rein, heißt ich verstehe zwar den code habe aber noch probleme selber etwas in asm umzusetzen.
habe jetzt hier einen kleinen kernel (den asm teil) der in den Protected Mode umschaltet um dann in den C_kernel zu springen und Hello world auszugeben.
ohne das in den PMode springen funktioniert das auch. so wie ich den code jetzt aber aufgebaut habe bekomme ich beim zusammenlinken der kernel_asm.o und kernel_c.o diese fehlermeldung
Code:
kernel_asm.o: In function `Base':
kernel.asm:(.text+0x6a): relocation truncated to fit: R_386_16 against `.text:'
das hier ist der asm kernel
Code:
global loader ; loader für Linker sichtbar machen
extern main ; main-Funktion des C-Kernels
FLAGS equ 0
MAGIC equ 0x1BADB002 ; Magicnumber - Erkennungsmerkmal für Grub
CHECKSUM equ -(MAGIC + FLAGS) ; Checksum
;---------------------------------------------------------------------------------------
NULL_Desc:
dd 0
dd 0
CODE_Desc:
dw 0xFFFF
dw 0
db 0
db 0x9A
db 0xCF
db 0
DATA_Desc:
dw 0xFFFF
dw 0
db 0
db 0x92
db 0xCF
db 0
gdt:
Limit dw 0
Base dd 0
cli
mov eax, cs
mov ds, ax
shl eax, 4
mov [CODE_Desc+2], ax
mov [DATA_Desc+2], ax
shr eax, 16
mov [CODE_Desc+4], al
mov [DATA_Desc+4], al
mov eax, cs
shl eax, 4
add eax, NULL_Desc
mov [Base], eax
mov [Limit], WORD gdt - NULL_Desc - 1
lgdt [gdt]
mov eax, cr0
or eax, 1
mov cr0, eax
db 0xea
dw PMODE
dw 0x8
[Bits 32]
section .text:
align 4
MultiBootHeader:
dd MAGIC ; Magic number
dd FLAGS ; Flags
dd CHECKSUM ; Checksum
PMODE:
mov WORD [CODE_Desc+2], 0
mov WORD [DATA_Desc+2], 0
mov BYTE [CODE_Desc+4], 0
mov BYTE [CODE_Desc+4], 0
mov eax, 2
shl eax, 3
mov ds, ax
mov es, ax
mov ss, ax
mov eax, 0
mov fs, ax
mov gs, ax
mov esp, 0x1FFFFF
jmp 0x8:0x1000 + PMODE2
PMODE2:
loader:
push eax ; Multiboot Magicnumber auf den Stack legen
push ebx ; Adresse der Multiboot-Structure auf den Stack legen
call main ; main-Funktion des C-Kernels aufrufen
cli ; falls der Kernel bis hier her kommt, CPU anhalten
hlt