Как исправить: «Ошибка чтения диска» в моем загрузчике - PullRequest
0 голосов
/ 14 октября 2019

Я использую Windows 10 и подсистему Windows для Linux. Я начал создавать свою собственную операционную систему в ассемблере и C. Я следую инструкциям. Я застрял в 2 проблемах.

Ошибка 1: Когда я связываю и создаю файлы bin, я получаю предупреждение: "ld: warning: не удается найти символ записи _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

diskload.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

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

У меня тоже была эта проблема, ошибка чтения диска может быть вызвана тем, что ваш конечный образ ОС слишком мал для чтения 15 секторов.

Если вы используете qemu, попробуйте изменить размер образа ОС с помощью:

qemu-img resize os.iso +20K

это изменит размер вашего изображения до 20 КБ (вместо 20 КБ вы можете указать собственное значение).

Я думаю, что qemu рассматривает образ операционной системы как весь диск, поэтому вам следуетизмените его размер соответственно.

0 голосов
/ 14 октября 2019

ld: предупреждение: не удается найти символ ввода _start;по умолчанию 0000000000001000

Результатом этой ошибки будет неправильный адрес точки входа, сохраненный в исполняемом файле.

Однако «сырые» двоичные файлы, содержащие только некоторыесодержание памяти;они не содержат никакой дополнительной информации - такой как точка входа - как это сделал бы файл ELF или COFF.

Другими словами: для «сырых» двоичных файлов (--oformat binary) это предупреждающее сообщение не имеетсмысл вообще.

Но когда я загружаю свою операционную систему, она показывает ошибку: Ошибка чтения диска!

Я не уверен, но есть два возможныхошибки:

  1. Вы уверены, что регистр ES содержит правильное значение?
    (Если вы хотите загрузить свое ядро ​​по абсолютному адресу 0x1000, вы должны установить ES до 0.)

  2. Многие типы дисков не поддерживают одновременное чтение слишком большого количества секторов.
    (Однако настоящий диск 1440K должен поддерживать чтение 15 секторов, начиная с сектора № 2.)

...