Nun das ist ja doch nicht so einfach, wie ich mir das gedacht habe.
bekomme ein Page not present von Bochs....
00008393105i[CPU0 ] (instruction unavailable) page not present
00008393105e[CPU0 ] exception(): 3rd (14) exception with no resolution, shutdown status is 00h, resetting
Folgenden Code habe ich mit Händen und Füßen geschrieben
[BITS 32]
EXTERN __kernel_start__
EXTERN __kernel_end__
EXTERN main
EXTERN code, bss, end
global start
start:
; Points the Stack to the new stack area
mov esp, _sys_stack
jmp stublet
ALIGN 4
mboot:
; Multiboot macros make a few lines more readable
MULTIBOOT_PAGE_ALIGN equ 1<<0
MULTIBOOT_MEMORY_INFO equ 1<<1
MULTIBOOT_AOUT_KLUDGE equ 1<<16
MULTIBOOT_HEADER_MAGIC equ 0x1BADB002
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_AOUT_KLUDGE
MULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
KERNEL_VIRTUAL_BASE equ 0xC0000000
KERNEL_VIRTUAL_DIR_NUMBER equ (KERNEL_VIRTUAL_BASE >> 22)
dd MULTIBOOT_HEADER_MAGIC
dd MULTIBOOT_HEADER_FLAGS
dd MULTIBOOT_CHECKSUM
dd mboot
dd code
dd bss
dd end
dd start
boot_page_directory:
dd 0x00000083
times (KERNEL_VIRTUAL_DIR_NUMBER - 1) dd 0
dd 0x00000083
times (1024 - KERNEL_VIRTUAL_DIR_NUMBER - 1) dd 0
stublet:
mov ecx, (boot_page_directory - KERNEL_VIRTUAL_BASE)
mov cr3, ecx
mov ecx, cr4
or ecx, 0x00000010
mov cr4, ecx
mov ecx, cr0
or ecx, 0x80000000
mov cr0, ecx
lea ecx, [start_higher_half_kernel]
jmp ecx
start_higher_half_kernel:
;mov dword [boot_page_directory], 0
;invlpg[0]
; Parse the Magic number
push eax
; Parse the multiboot Structure
push ebx
; call main
;call _main
jmp $
SECTION .bss
resb 8192
_sys_stack:
Hier ist noch mein Linker-Script, dass ich nach meinen Bedürfnissen abgeändert habe:
OUTPUT_FORMAT("elf32-i386")
ENTRY(start)
phys = 0x00100000;
virt = 0xC0100000;
SECTIONS
{
. = virt;
.text virt : AT(phys)
{
__kernel_start__ = .;
code = .;
*(.text)
*(.rodata)
. = ALIGN(4096);
}
.data : AT(phys + (data - code))
{
data = .;
*(.data)
. = ALIGN(4096);
}
.bss : AT(phys + (bss - code))
{
bss = .;
*(.bss)
. = ALIGN(4096);
}
end = .;
__kernel_end__ = .;
}
Wo liegt mein Fehler?
Ich finde ihn nicht und meine nasm Kenntnisse, oder Generell Assemblerkenntnisse sind nicht so umwerfend gut.
Dann habe ich ausserdem noch eine Frage:
Kann ich anstatt der 4MB-Pages auch normale 4KB-Pages benutzen?
Oder hat das irgend einen Grund, dass in allen Code Stückern, die ich bis jetzt gesehen habe, die Page 4MB-Groß ist?
Gruß Christian
*EDIT*
Bei dem Code habe ich mich an dem Beispiel in der OSDev.org Wiki orientiert, allerdings nur das Paging.