Невозможно переключиться в защищенный режим при создании собственной операционной системы - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь создать свою собственную операционную систему, и теперь я пытаюсь переключиться в 32-битный защищенный режим. Эмулятор падает, когда достигает определенной точки в коде. Пожалуйста, помогите.

Bootsector.asm

KERNEL_OFFSET equ 0x1000 

    mov [BOOT_DRIVE], dl 
    mov bp, 0x9000
    mov sp, bp
    ;call print_string1
    call start1

start2:

    mov bp, 0x9000
    mov sp, bp

    call disk_load
    call switch_to_pm
    mov ah, 0
    int 0x10
    mov ax, 0
    int 0x16
    jmp $


%include "boot/print.asm"
%include "boot/print_hex.asm"
%include "boot/disk.asm"
%include "boot/gdt.asm"
%include "boot/32bit_print.asm"
%include "boot/switch_pm.asm"


start_os_intro db 'Welcome to DarkraiOS!',0
press_key db '>> Press any key <<',0


[bits 16]
load_kernel:



    mov bx, KERNEL_OFFSET 
    mov dh, 1
    mov dl, [BOOT_DRIVE]
    jmp start2 


start1:


    mov ax, 0x0          
    mov ds, ax           
    mov es, ax           
    mov bx,0x8000
    mov ah,0 ;clearScreen 
    int 0x10       
    mov ah,02 ;big font
        int 0x10

Часть bootsector.asm

BEGIN_PM:

    mov ebx, start_os_intro
    call print_string_pm
    call KERNEL_OFFSET      
    jmp $

switch_pm.asm

switch_to_pm:
    mov ah, 0
    int 0x10
    int 0x16

    cli 
    lgdt [gdt_descriptor] 


    mov eax, cr0
    or eax, 0x1 
    mov cr0, eax
    jmp CODE_SEG:init_pm 

[bits 32]
init_pm: 


    mov ax, DATA_SEG 
    mov ds, ax
    mov ss, ax
    mov es, ax
    mov fs, ax
    mov gs, ax

    mov ebp, 0x90000 
    mov esp, ebp


    call BEGIN_PM 

Код загрузочного сектораработает нормально, но когда код возвращается к start2 и выполняет disk_load и switch_to_pm. Disk_load работает нормально, но switch_to_pm не работает. код падает после выполнения mov cr0, eax в switch_pm.asm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...