Запуск загрузочного сектора в VirtualBox

#assembly #bootloader #boot #floppy

#сборка #загрузчик #загрузка #дискета

Вопрос:

Я создал простую операционную систему, и у меня проблема с запуском ядра, на самом деле ядро ничего не печатает.

Загрузочный сектор :

 bits 16
org 0x7c00 ; 0x7c00 > Boot amp; 0x7c00   512 (0x7e00) > Kernel

%ifdef WITH_BPB
%include "BIOSParameterBlock.inc"
%endif

boot_continue:

    mov ax, 0x1000      
    mov ss, ax      ;SS:SP > 0x1000:0xfffe (0x1fffe)
    mov ax, 0xfffe
    mov sp, ax
    cld

    xor ax, ax
    mov ds, ax      ;DS:SI > 0x0000:0x0001 (0x00001)
    mov bx, ax
    mov ax, 0x0001  ;ES:BX > 0x07e0:0x0000 (0x07e00)
    mov si, ax
    mov ax, 0x07e0
    mov es,ax
    
    Kernel2Memory:
    mov al, 0x01    ; Load 1 sectors
    mov ah, 0x02    ; Load disk data to ES:BX
    mov cl, 0x01    ; Sector = 1
    mov ch, 0x00    ; Cylinder = 0
    mov dh, 0x00    ; Head = 0
    int 13h         ; Read
    jc Kernel2Memory

    jmp 0x07e0:0x0000

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

    incbin "Kernel.bin"

    TIMES 1024*1440-($-$) db 0x00
 

Блок параметров BIOS, который будет добавлен к первому из загрузочного сектора (BIOSParameter.inc):

     global bpb_disk_info
    jmp short boot_continue
    nop

    bpb_disk_info:

    ; Dos 4.0 EBPB 1.44MB floppy
    OEMname:           db    "mkfs.fat"  ; mkfs.fat is what OEMname mkdosfs uses
    bytesPerSector:    dw    512
    sectPerCluster:    db    1
    reservedSectors:   dw    1
    numFAT:            db    2
    numRootDirEntries: dw    224
    numSectors:        dw    2880
    mediaType:         db    0xf0
    numFATsectors:     dw    9
    sectorsPerTrack:   dw    18
    numHeads:          dw    2
    numHiddenSectors:  dd    0
    numSectorsHuge:    dd    0
    driveNum:          db    0
    reserved:          db    0
    signature:         db    0x29
    volumeID:          dd    0x2d7e5a1a
    volumeLabel:       db    "NO NAME    "
    fileSysType:       db    "FAT12   "
 

И код ядра, скажем, печатает простой символ «A» (Kernel.bin):

 org 0x7e00
mov al,0x41
mov ah,0x0e
mov bl,0x07
mov bh,0x00
int 0x10
times 512-($-$) db 0
 

он ничего не печатает. Я прочитал много проблем и решений в StackOverflow и отладил его, насколько мог (я новичок в этой области). Я буду благодарен, если кто-нибудь поможет мне с проблемой.

команда, которую я использую:

nasm -fbin Kernel.asm -o Kernel.bin

nasm -DWITH_BPB -f bin Boot.asm -o OS.img

затем запустите его как дискету в VirtualBox

Заранее спасибо

Комментарии:

1. Сбивает с толку, сектора нумеруются с 1. Итак, вы хотите загрузить сектор # 2.

2. @Jester изменить cx,0x01 на cx,0x02 ? проверено … не работает

3. Возможно, вы также захотите добавить что-то в конце, например jmp $ , для бесконечного цикла. Работает в qemu, не тестировал virtualbox.

4. Вы, конечно, хотите загрузить сектор 2 (второй сектор), а не 1. Кроме того, ваши org 7E00h конфликты с jmp 7E0h:0 . Либо используйте org 0 с этим переходом, либо сохраните org 7E00h , но перейдите к 0:7E00h .

5. Я изменил org , добавил halt: sti hlt jmp halt после завершения кода ядра, изменил на mov cl, 2 и поместил mov sp в качестве следующей инструкции после mov ss . Он отлично работает в dosemu2 и отображается A .