读取磁盘时出现奇怪的错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读取磁盘时出现奇怪的错误相关的知识,希望对你有一定的参考价值。
所以,我一直在从事一个爱好项目。创建我自己的操作系统。我开始前一阵子,但直到几晚之前才放下它。我刚刚修复了一个疏忽,导致我要读取的扇区中没有任何内容可供读取。有了这个错误,就出现了一个新错误,老实说,我什至不知道从哪里开始调试这个错误。
我正在编码主引导记录,并使用GDB和QEMU对其进行调试,这是我的主引导记录的代码(它是使用YASM汇编的)
很抱歉,我的代码不是很好。我不是汇编语言专家...
; yasm boot.asm -fbin
bits 16
%define part(n,l) section n vstart=l align=1
%define rpart(n,l) section n start=l align=1
; ----------------------- ;
part(entry, 0x7c00) ;
; --ENTRY---------------- ;
_start:
mov [boot_drive+0x7c00], dl
xor ax, ax
mov ss, ax
mov ds, ax
mov es, ax
mov sp, _start
mov bp, _start
mov cx, 512
mov si, _start
mov di, _strap
rep movsb
jmp 0:_strap+(b_boot_strapper-$$)
b_boot_strapper:
; ----------------------- ;
part(strap, 0x0600) ;
; --BOOT STRAPPER-------- ;
_strap:
xor cx, cx
.find_active_part:
cmp cl, 4
jge .no_active_part
xor ax, ax
mov ah, cl
mov bl, 16
mul bl
mov bx, ax
inc cl
mov al, (1 << 7)
mov ah, [partition_1+0x600+bx]
and ah, al
jnz .load_active_part
jmp .find_active_part
.load_active_part:
xor ax, ax
mov ds, ax
mov ah, 42h
mov dl, [boot_drive+0x600]
mov si, dap+0x600
push bx
mov bx, dap+0x600
mov es, bx
pop bx
mov cx, [partition_1+0x600+bx+8]
mov [dap_startlba+0x600], cx
mov cx, [partition_1+0x600+bx+12]
mov [dap_sectors+0x600], cx
int 13h
jc .disk_error
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov sp, _start
mov bp, _start
mov dl, [boot_drive+0x600]
jmp 0:0x7c00
.no_active_part:
mov si, msg_no_part
call print
jmp halt
.disk_error:
mov si, msg_er_read
call print
jmp halt
print:
mov dx, ax
mov ah, 0Eh
xor bh, bh
mov bl, 0Fh
.rep:
lodsb
or al, al
jz .done
int 10h
jmp .rep
.done:
ret
halt:
cli
hlt
jmp halt
msg_er_read db 'Disk Read Error....', 0
msg_no_part db 'No Active Partition....', 0
; ----------------------- ;
rpart(variables, 300) ;
; --VARIABLES------------ ;
boot_drive db 0
dap: ; Disk Address Packet
db 16, 0
dap_sectors dw 0
dap_offset dw 0x7c00
dap_segment dw 0
dap_startlba dq 0
dap_end:
; ----------------------- ;
rpart(partitions, 446) ;
; --VARIABLES------------ ;
partition_1: ; This file has the following 16 bytes:
; 0x80, 0x01, 0x00, 0x05, 0x17, 0x01, x03, 0x01, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00
%include "part_n1.asm"
partition_2: ; The rest of these files are just 16 null bytes.
%include "part_n2.asm"
partition_3:
%include "part_n3.asm"
partition_4:
%include "part_n4.asm"
; ------------------------------- ;
rpart(signature, 510) ;
db 0x55, 0xAA ;
; ------------------------------- ;
此代码有效!但是,我不知道这是否是QEMU的问题,但是当它从扇区读取时,它有一些损坏或数据丢失...
这些是预期为0x7c00的字节
EB 1B B4 0E 30 FF B3 0F
AC 74 04 CD 10 EB F9 C3
48 65 6C 6C 6F 20 57 6F
72 6C 64 21 00 BE 10 7C
E8 DF FF F4
(这是打印“ Hello World!”的基本功能。)>
这就是最终实际存储在该位置的内容:
EB 1B B4 0E 30 FF B3 0F AC 74 04 CD 10 EB F9 C3 48 65 6C 6C 6F 20 57 6F 72 6C 64 21 00 BE 10 7C F0 DF FF F4
[如果您仔细查看最后一个字节的第4个字节已从E8更改为F0,我不知道为什么会这样。在最后一次运行中,“ Hello World”中的“ E”也进行了更改,但不在此调试运行中。
我甚至需要从哪里开始调试都需要帮助...
编辑1
我意识到我的打印hello world的功能存在一些问题,无论是否天气,这些问题都与这个奇怪的事情有关,我真的不知道。在打印功能的重复部分(我正在加载的代码中的那个,而不是上面的mbr代码中的那个),我忘记了在执行or al, al
之后和执行lodsb
之前可能会干扰的jz .done
。关于事情,我不确定,但是在更新该代码并运行了更多调试会话后,似乎不再出现此问题...
所以,我一直在从事一个爱好项目。创建我自己的操作系统。我开始前一阵子,但直到几晚之前才放下它。我只是纠正了导致什么都不是的疏忽。
您的代码有很多问题,但很可能是问题出在您未显示的卷启动记录中。 MBR中应解决的一些问题:
以上是关于读取磁盘时出现奇怪的错误的主要内容,如果未能解决你的问题,请参考以下文章