【问题标题】:How to fix: "Disk Read Error" in my bootloader如何修复:我的引导加载程序中的“磁盘读取错误”
【发布时间】:2023-03-18 05:55:02
【问题描述】:

我正在使用适用于 linux 的 Windows 10 和 Windows 子系统。 我已经开始在 Assembly 和 C 中创建自己的操作系统。 我正在关注一个教程。 我陷入了 2 个问题。

错误 1: 当我链接并创建 bin 文件时,我收到警告: “ld:警告:找不到条目符号_start;默认为0000000000001000” 这有关系吗?

错误 2: 编译我的代码后,没有错误。但是当我启动我的操作系统时,它显示一个错误:磁盘读取错误!

请帮帮我。

Boot.asm

[org 0x7c00]
KERNEL_OFFSET equ 0x1000 
mov [BOOT_DRIVE], dl 

mov bp, 0x9000
mov sp, bp
mov si, MSG_REAL_MODE 
call print 
call load_kernel 
call switch_to_pm 

jmp $

%include "printstr.asm"
%include "diskload.asm"
[bits 16]

load_kernel :
mov si, MSG_LOAD_KERNEL 
call print
mov bx, KERNEL_OFFSET 
mov dh, 15 
mov dl, [ BOOT_DRIVE ]
call disk_load 
ret
[bits 32]

BEGIN_PM :
mov ebx, MSG_PROT_MODE 
call print_string_pm 
call KERNEL_OFFSET 


jmp $

BOOT_DRIVE db 0
MSG_REAL_MODE db " Started in 16 - bit Real Mode " , 0
MSG_PROT_MODE db " Successfully landed in 32 - bit Protected Mode " , 0
MSG_LOAD_KERNEL db " Loading kernel into memory. " , 0

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

磁盘加载.asm

disk_load :
push dx 

mov ah , 0x02 
mov al , dh ; 
mov ch , 0x00 
mov dh , 0x00 
mov cl , 0x02 

int 0x13 
jc disk_error 
pop dx 
cmp dh , al 
jne disk_error 
ret
disk_error :
mov si , DISK_ERROR_MSG
call prints
jmp $
; Variables
DISK_ERROR_MSG db " Disk read error !" , 0
prints:
lodsb           
    or  al, al  
    jz  printdones
    mov ah, 0eh     
    int 10h
    jmp prints      

printdones:
    ret

编译命令:

nasm boot.asm -f bin -o boot.bin
nasm kernel_entry.asm -f elf64 -o kernel_entry.o
gcc -ffreestanding -c kernel.c -o kernel.o
ld -o kernel.bin -Ttext 0x1000 kernel_entry.o kernel.o --oformat binary
cat boot.bin kernel.bin > os.iso

【问题讨论】:

    标签: c assembly osdev


    【解决方案1】:

    ld:警告:找不到入口符号_start;默认为 0000000000001000

    这个错误的影响会是存储在可执行文件中的入口点地址不正确。

    但是,“原始”二进制文件只包含一些内存内容;它们不包含任何附加信息 - 例如入口点 - 就像 ELF 或 COFF 文件那样。

    换句话说:对于“原始”二进制文件 (--oformat binary),此警告消息毫无意义。

    但是当我启动我的操作系统时,它显示一个错误:磁盘读取错误!

    我不确定,但有两个可能的错误:

    1. 您确定ES 寄存器包含正确的值吗?
      (如果要将内核加载到绝对地址 0x1000,则必须将 ES 设置为 0。)

    2. 许多驱动器类型不支持一次读取太多扇区。
      (但真正的 1440K 驱动器应该支持从扇区 #2 开始读取 15 个扇区。)

    【讨论】:

      【解决方案2】:

      我也有这个问题,磁盘读取错误可能是由于您的最终操作系统映像太小而无法读取 15 个扇区。

      如果您使用 qemu,请尝试调整您的操作系统图像大小:

      qemu-img resize os.iso +20K
      

      这会将您的图片大小调整为 20 KB (您可以输入自己的值而不是 20K)。

      我认为 qemu 将 os 映像视为整个磁盘,因此您应该相应地调整它的大小。

      【讨论】:

      • 我试过了,但没有得到它。我正在使用 Virtual Box 和 VMware。让我检查一下qemu
      猜你喜欢
      • 2020-12-05
      • 2023-03-23
      • 2011-12-08
      • 1970-01-01
      • 2017-08-10
      • 2017-07-28
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多