bios int 0x13 завершается с ошибкой - PullRequest
2 голосов
/ 12 мая 2011

Я пишу загрузчик для образовательных целей, и все идет хорошо. Но когда я пытался загрузиться на реальной машине, мой код чтения с диска не загружал некоторые сектора. Код ошибки не указан, и CF не установлен. Он также возвращает 1 в al, что означает, что 1 сектор был прочитан (что должно быть правильно). Но когда я пытаюсь перейти к загруженному сектору, он просто зависает и ничего не делает .. На первом этапе печатается буква A, которая на втором этапе перезаписывается буквой F. При загрузке на реальном оборудовании отображается только буква A. Так что сектор не в памяти, где он должен быть ..

Это мой MBR:

LOADOFF equ 0x7C00
BUFFER equ 0x600

[bits 16]
[org 0x7c00]

jmp _start
nop 
    bootdisk db 0

_start: ; entry point
    jmp 0x0:.flush
.flush:
    xor ax, ax
    mov ds, ax
    mov es, ax
    cli
    mov ss, ax
    mov sp, LOADOFF     ; stack setup
    sti

    mov [bootdisk], dl ; boot drive number given by the bios in dl

    mov si, migrate ; move the code below to the buffer
    mov di, BUFFER
    mov cx, 256
    cld
    rep
    movsw

    jmp 0x0:BUFFER ;get my ass in the buffer
migrate:

.reset:
    xor ax, ax      ; reset the disk
    mov dl, [bootdisk]
    int 0x13
    jc .reset

.read:
    mov ah, 0x2
    mov al, 1 ; read 1 sector
    xor cx, cx ; cylinder 0
    mov cl, 2 ; sector 2
    mov dl, [bootdisk]
    xor dh, dh ; head 0


    ; setup buffer
    xor bx, bx
    mov es, bx
    mov bx, 0x7c00 ; chain load it
    int 0x13
    jc .read

    test ah, ah
    jnz .reset

    cmp al, 0x1 ; is there one and only one sector loaded?
    jne .reset

    mov ax, 0xb800
    mov es, ax
    xor di, di
    mov al, 65 ; capital A
    mov ah, 0xc 
    stosw

;   mov ax, 0x7c0
;   mov es, ax
;   xor di, di
;   
;   mov [es:di], byte 191          ; this code proves that my far jump does its work
;   mov [es:di+1], byte 160       ; if you would like to test, comment it out.
;   mov [es:di+2], byte 128
;   mov [es:di+3], byte 184
;   mov [es:di+4], byte 0
;   mov [es:di+5], byte 176
;   mov [es:di+6], byte  142
;   mov [es:di+7], byte 192
;   mov [es:di+8], byte 184
;   mov [es:di+9], byte 88
;   mov [es:di+10], byte 14
;   mov [es:di+11], byte 171

    jmp 0x0:0x7c00      ; execute the loaded sector

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

ORG 0x7C00
[BITS 16]

Этап 2:

    stage2:
    mov ax, 0xb800
    mov es, ax
    xor di, di
    mov al, 70
    mov ah, 0xc
    stosw
    jmp $

times 512 - ($ - $$) db 0

Отлично работает в kvm, но НЕ на реальном оборудовании с настоящим биосом. Я использую флэш-накопитель USB для проверки загрузки на реальном оборудовании.

Может ли быть проблема в BPB, который я не определяю в первых байтах моего mbr? Я так не думаю, потому что я просто читаю сырые секторы ... поправьте меня, если я ошибаюсь.

Кто-нибудь знает, что это может быть?

Спасибо

1 Ответ

2 голосов
/ 20 мая 2011

Ваш код пытается загрузить диск 0, который является "первым дисководом гибких дисков". Современные HDD (и USB-флешки) обычно доступны как диск 0x80. Так что просто попробуйте

bootdisk db 0x80

в вашем коде.

...