首页 > 解决方案 > 操作系统在真实硬件上表现怪异,但在模拟器上完美运行

问题描述

我目前正在关注操作系统开发教程(https://www.youtube.com/watch?v=pXzortxPZR8&list=PLxN4E629pPnKKqYsNVXpmCza8l0Jb6l8-

我到了第 4 集,我决定在真实硬件上测试我的操作系统,所以我复制了“boot.bin”文件的二进制内容,并使用 HxD 十六进制编辑器将它放在 USB 闪存驱动器上。我还确保将字节放入正确的扇区,但是当我尝试从中启动时,我得到的只是屏幕底部的笑脸表情符号(操作系统用于从磁盘读取 4 个扇区并说“磁盘读取成功”如果成功,它也是 32 位的,我从教程中制作了一个全局描述符表)我使用的 USB 是带有 FAT 文件系统的 4gb MBR 格式 USB,我也尝试过 FAT32,但它没有帮助,我用来启动的计算机也是一台旧PC,我决定为它制作一个操作系统(它有一个死硬盘,所以我无法在上面安装Windows,我决定通过这样做我可以学到一些新东西)。谁能帮我?我真的很想让这个工作。

编辑:我忘了提这个,但正如标题所说,它在模拟器上运行得非常好

引导加载程序:

[org 0x7c00]

mov [BOOT_DISK], dl

mov bp, 0x7c00
mov sp, bp

call ReadDisk

jmp PROGRAM_SPACE

%include "print.asm"
%include "DskRead.asm"

times 510-($-$$) db 0
dw 0xaa55

读盘程序:

PROGRAM_SPACE equ 0x7e00

ReadDisk:
    mov ah, 0x02
    mov bx, PROGRAM_SPACE
    mov al, 4
    mov dl, [BOOT_DISK]
    mov ch, 0x00
    mov dh, 0x00
    mov cl, 0x02
    int 0x13
    jc DiskReadFailed
    ret

BOOT_DISK:
    db 0

DiskReadErrorStr:
    db 'Failed To Read Disk',0

DiskReadFailed:
    mov bx, DiskReadErrorStr
    call printstr
    jmp $

扩展程序(在 secotr 2 或更高版本上编写的代码):

[org 0x7e00]

jmp EnterProtectedMode

%include "gdt.asm"
%include "print.asm"

EnterProtectedMode:
    call EnableA20
    cli
    lgdt [gdt_descriptor]
    mov eax, cr0
    mov eax, 1
    mov cr0, eax
    jmp codeseg:StartProtectedMode

EnableA20:
    in al, 0x92
    or al, 2
    out 0x92, al
    ret

[bits 32]

StartProtectedMode:
    mov ax, dataseg
    mov ds, ax
    mov ss, ax
    mov es, ax
    mov fs, ax
    mov gs, ax
    mov [0xb8000], byte 'H'
    jmp $

times 2048-($-$$) db 0

打印功能代码:

printstr:
    mov ah, 0x0e
    .Loop:
    cmp [bx], byte 0
    je .Exit
        mov al, [bx]
        int 0x10
        inc bx
        jmp .Loop
    .Exit:
    ret

GDT:

gdt_nulldesc:
    dd 0
    dd 0
gdt_codedesc:
    dw 0xFFFF
    dw 0x0000
    db 0x00
    db 10011010b
    db 11001111b
    db 0x00
gdt_datadesc:
    dw 0xFFFF
    dw 0x0000
    db 0x00
    db 10010010b
    db 11001111b
    db 0x00

gdt_end:


gdt_descriptor:
    gdt_size:
        dw gdt_end - gdt_nulldesc - 1
        dd gdt_nulldesc

codeseg equ gdt_codedesc - gdt_nulldesc
dataseg equ gdt_datadesc - gdt_nulldesc

运行蝙蝠脚本(QEMU):

qemu-system-x86_64 boot.bin

编译蝙蝠脚本(NASM):

nasm -f bin boot.asm -o boot.bin
nasm -f bin ExtPrg.asm -o ExtPrg.bin
copy /b boot.bin+ExtPrg.bin boot.bin

标签: assemblyoperating-systemnasmbootloaderosdev

解决方案


推荐阅读