2016-08-16 4 views
0

Я только что закончил более высокий уровень в qemu. Но по какой-то причине дает мне ошибку на Virtual Box и Bochs:Точка входа не находится в сегменте

entry point isnt in a segment. 

please press any key to continue . . . 

Но в Qemu работает все нормально. Ну вот мой компоновщик скрипт, где я определил мою точку входа:

/* The bootloader will look at this image and start execution at the symbol 
    designated as the entry point. */ 
ENTRY(loader) 

SECTIONS { 
    /* The kernel will live at 3GB + 1MB in the virtual 
     address space, which will be mapped to 1MB in the 
     physical address space. */ 
    . = 0xC0100000; 


    .text ALIGN (0x1000) : AT(ADDR(.text) - 0xC0000000) { 
     *(.multiboot) 
     *(.text) 
     *(.rodata*) 
    } 

    .data ALIGN (0x1000) : AT(ADDR(.data) - 0xC0000000) { 
     start_ctors = .; 
     KEEP(*(.init_array)); 
     KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*))); 
     end_ctors = .; 
     *(.data) 
    } 

    .bss : AT(ADDR(.bss) - 0xC0000000) { 
     _sbss = .; 
     *(COMMON) 
     *(.bss) 
     _ebss = .; 
    } 
} 

и мой boot.asm (GRUB):

;Global MultiBoot Kernel Recongnzation 
MAGIC equ 0x1badb002 
FLAGS equ (1<<0 | 1<<1) 
CHECKSUM equ -(MAGIC + FLAGS) 


;Putting in object file 
section .multiboot 
    dd MAGIC 
    dd FLAGS 
    dd CHECKSUM 

section .data 

KERNEL_VIRTUAL_BASE equ 0xC0000000     ; 3GB 
KERNEL_PAGE_NUMBER equ (KERNEL_VIRTUAL_BASE >> 22) ; Page directory index of kernel's 4MB PTE. 

align 0x1000 
BootPageDirectory: 
    ; This page directory entry identity-maps the first 4MB of the 32-bit physical address space. 
    ; All bits are clear except the following: 
    ; bit 7: PS The kernel page is 4MB. 
    ; bit 1: RW The kernel page is read/write. 
    ; bit 0: P The kernel page is present. 
    ; This entry must be here -- otherwise the kernel will crash immediately after paging is 
    ; enabled because it can't fetch the next instruction! It's ok to unmap this page later. 
    dd 0x00000083 
    times (KERNEL_PAGE_NUMBER - 1) dd 0     ; Pages before kernel space. 
    ; This page directory entry defines a 4MB page containing the kernel. 
    dd 0x00000083 
    times (1024 - KERNEL_PAGE_NUMBER - 1) dd 0 ; Pages after the kernel image. 


section .text 
    extern kernelMain 
    extern callConstructors 
    extern page_directory 
    extern pages_init 
    ; reserve initial kernel stack space -- that's 16k. 
    STACKSIZE equ 0x4000 
    ; setting up entry point for linker 
    loader equ (_loader - 0xC0000000) 
    global loader 

     _loader: 
        ;Enable Paging START 

        ; NOTE: Until paging is set up, the code must be position-independent and use physical 
        ; addresses, not virtual ones! 
        mov ecx, (BootPageDirectory - KERNEL_VIRTUAL_BASE) 
        mov cr3, ecx          ; Load Page Directory Base Register. 

        mov ecx, cr4 
        or ecx, 0x00000010       ; Set PSE bit in CR4 to enable 4MB pages. 
        mov cr4, ecx 

        mov ecx, cr0 
        or ecx, 0x80000000       ; Set PG bit in CR0 to enable paging. 
        mov cr0, ecx 


        lea ebx, [higherhalf] 
        jmp ebx 

     higherhalf: 
       ; Unmap the identity-mapped first 4MB of physical address space. It should not be needed 
       ; anymore. 
       mov dword [BootPageDirectory], 0 
       invlpg [0] 

       mov esp, stack   ; set up the stack 
       call callConstructors 

       push eax 
       push ebx 
       call kernelMain 
       jmp _eof 

     _eof: 
      cli 
      hlt 
      jmp _eof 


section .bss 
align 32 
stack: 
    resb STACKSIZE  ; reserve 16k stack on a uint64_t boundary 

Вот мой полный исходный код моих ОС: https://github.com/amanuel2/OS_MIRROR. Помощь была бы оценена.

+2

Полностью не связан с вашей проблемой. Но я заметил, что вы делаете «mov esp, stack». Таким образом, ESP будет расти из метки 'stack'. Но вы определяете 'stack' с' stack: resb STACKSIZE'. Проблема в том, что стек будет расти в память перед стеке меток. Вы должны поместить метку после 'resb STACKSIZE' и использовать ее как верхнюю часть стека. –

+0

@MichaelPetch so mov esp, stack + STACKSIZE? – amanuel2

+0

В этом случае этого было бы достаточно. –

ответ

0

Что решил это было, когда я избавилась от заявления фас, и только начал с заявления входа:

;Global MultiBoot Kernel Recongnzation 
    MAGIC equ 0x1badb002 
    FLAGS equ (1<<0 | 1<<1) 
    CHECKSUM equ -(MAGIC + FLAGS) 


    ;Putting in object file 
    section .multiboot 
     dd MAGIC 
     dd FLAGS 
     dd CHECKSUM 

    section .data 

    KERNEL_VIRTUAL_BASE equ 0xC0000000     ; 3GB 
    KERNEL_PAGE_NUMBER equ (KERNEL_VIRTUAL_BASE >> 22) ; Page directory index of kernel's 4MB PTE. 

    align 0x1000 
    BootPageDirectory: 
     ; This page directory entry identity-maps the first 4MB of the 32-bit physical address space. 
     ; All bits are clear except the following: 
     ; bit 7: PS The kernel page is 4MB. 
     ; bit 1: RW The kernel page is read/write. 
     ; bit 0: P The kernel page is present. 
     ; This entry must be here -- otherwise the kernel will crash immediately after paging is 
     ; enabled because it can't fetch the next instruction! It's ok to unmap this page later. 
     dd 0x00000083 
     times (KERNEL_PAGE_NUMBER - 1) dd 0     ; Pages before kernel space. 
     ; This page directory entry defines a 4MB page containing the kernel. 
     dd 0x00000083 
     times (1024 - KERNEL_PAGE_NUMBER - 1) dd 0 ; Pages after the kernel image. 


    section .text 
     extern kernelMain 
     extern callConstructors 
     extern page_directory 
     extern pages_init 
     ; reserve initial kernel stack space -- that's 16k. 
     STACKSIZE equ 0x4000 
     ; setting up entry point for linker 
     loader equ (_loader - 0xC0000000) 
     global loader 

     _loader: 
        ;Enable Paging START 

        ; NOTE: Until paging is set up, the code must be position-independent and use physical 
        ; addresses, not virtual ones! 
        mov ecx, (BootPageDirectory - KERNEL_VIRTUAL_BASE) 
        mov cr3, ecx          ; Load Page Directory Base Register. 

        mov ecx, cr4 
        or ecx, 0x00000010       ; Set PSE bit in CR4 to enable 4MB pages. 
        mov cr4, ecx 

        mov ecx, cr0 
        or ecx, 0x80000000       ; Set PG bit in CR0 to enable paging. 
        mov cr0, ecx 


        lea ebx, [higherhalf] 
        jmp ebx 

     higherhalf: 
       ; Unmap the identity-mapped first 4MB of physical address space. It should not be needed 
       ; anymore. 
       mov dword [BootPageDirectory], 0 
       invlpg [0] 

       mov esp, stack   ; set up the stack 
       call callConstructors 

       push eax 
       push ebx 
       call kernelMain 
       jmp _eof 

     _eof: 
      cli 
      hlt 
      jmp _eof 


section .bss 
align 32 
stack: 
    resb STACKSIZE  ; reserve 16k stack on a uint64_t boundary 

Получили эту помощь от OsDev Wiki: http://f.osdev.org/viewtopic.php?f=1&t=28796.

+0

Код, который вы опубликовали, идентичен первой версии, за исключением того, что во втором есть дополнительные вкладки и пробелы. Сам код не отличается. –

Смежные вопросы