读取磁盘时出现奇怪的错误

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中应解决的一些问题:

以上是关于读取磁盘时出现奇怪的错误的主要内容,如果未能解决你的问题,请参考以下文章

使用柴油和杜松插入值时出现奇怪的错误

关闭文件时出现段错误

使用valgrind时出现奇怪的错误?也许是一个错误?

部署 SQL Server 报告时出现奇怪的错误

bcc32:专注于`std::vector<bool>`时出现奇怪的错误

淘淘商城系列——使用maven构建工程时出现的错误