assembly - 操作系统在真实硬件上表现怪异,但在模拟器上完美运行
问题描述
我目前正在关注操作系统开发教程(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
解决方案
推荐阅读
- c - 递归两个列表之间的差异
- c# - 如何修复 VerticalLineAnnotation 始终将绑定设置为零
- c# - implement datatable js in Asp.Net API server side processing
- powershell - 如何使用 Powershell 在 Azure AD 应用程序中为隐式流启用访问令牌
- sql - 通过生成查询从 DataFrame 中获取数据并插入到 SQL 表中的多行中
- ios - 如何在 iOS 13 中更改状态栏 Alpha?
- reactjs - Mobx 如何等到 Promise
完成然后运行不同的功能 - javascript - C# ToDictionary 的 JavaScript 等价物
- powershell - 我在创建唯一目录和文件时做错了什么,同时使用 PowerShell 验证目录和文件名是唯一的?
- node.js - 重新启动 EC2 现在我无法调用我的快速 API