Старый загрузчик BIOS для загрузки кода реального режима на втором этапе

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

12
задан Michael Petch 27 February 2019 в 01:48
поделиться

1 ответ

Я написал такой код как часть других ответов, но никогда не имел возможности представить простой тестовый комплект, на который можно ссылаться из других вопросов Stackoverflow. То, что вы просите, довольно тривиально. Это можно сделать, написав загрузчик в NASM, который содержит двоичный образ собранного кода, который вы хотите протестировать. Этот образ будет считываться с диска, начиная с LBA 1 (первый сектор после загрузчика), с использованием функции BIOS Int 13 / ah = 2 . Затем управление будет передано ему через FAR JMP на 0x0000: 0x7e00.

Код загрузчика будет выглядеть следующим образом:

bpb.inc :

%define WITH_BPB 1
global bpb_disk_info

    jmp boot_start
    TIMES 3-($-$) DB 0x90   ; Support 2 or 3 byte encoded JMPs before BPB.

    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   "

boot.asm :

[ 111]

Чтобы использовать это, вы бы сначала сгенерировали двоичный файл с именем stage2.bin. Затем вы должны построить образ диска 1.44MiB с помощью этой команды:

nasm -f bin boot.asm -o disk.img

Код в stage2.bin должен быть сгенерирован с допущением, что ORG (начальная точка) 0x07e00 в памяти. [1127 ]


Пример использования / Пример

Пример кода, сгенерированного для файла с именем stage2.bin, который можно загрузить с помощью этого тестового набора:

testcode.asm [ 1139]:

ORG 0x7e00

start:
    mov si, testCodeStr
    call print_string

    cli
.end_loop:
    hlt
    jmp .end_loop

testCodeStr: db "Test harness loaded and is executing code in stage2!", 0

; Function: print_string
;           Display a string to the console on display page 0
;
; Inputs:   SI = Offset of address to print
; Clobbers: AX, BX, SI

print_string:
    mov ah, 0x0e                ; BIOS tty Print
    xor bx, bx                  ; Set display page to 0 (BL)
    jmp .getch
.repeat:
    int 0x10                    ; print character
.getch:
    lodsb                       ; Get character from string
    test al,al                  ; Have we reached end of string?
    jnz .repeat                 ;     if not process next character
.end:
    ret

Примечание : сверху есть ORG 0x7e00. Это важно. Чтобы собрать этот файл в stage2.bin, используйте:

nasm -f bin testcode.asm -o stage2.bin

Затем создайте образ диска 1.44MiB с:

nasm -f bin boot.asm -o disk.img

Результатом должен быть образ диска размером точно 1.44MiB, содержит копию stage2.bin и загрузочный сектор нашего тестового жгута.

Файл stage2.bin может быть любым, в который записан двоичный код для загрузки и запуска в 0x0000: 0x7e00. Язык (C, ассемблер и т. Д.), Используемый для создания кода в stage2.bin, не имеет значения. Я использую NASM для этого примера. Когда этот тестовый код выполняется в QEMU с использованием qemu-system-i386 -fda disk.img, он будет выглядеть примерно так:

enter image description here


Special Примечание: : Если вы не хотите использовать bpb.inc и не собираетесь загружаться с USB с помощью эмуляции FDD, вы можете закомментировать или удалить эту строку в boot.asm

%include "bpb.inc"
0
ответ дан Michael Petch 27 February 2019 в 01:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: