Phoenix BIOS пропускает код MBR, что такое АКТУАЛЬНЫЙ стандарт BIOS? - PullRequest
0 голосов
/ 18 декабря 2018

Я хочу научить ассемблер использовать ультра-минимальный голый код, чтобы любой работающий на x86-совместимый компьютер отображал на экране жестко закодированный текст при включении.Я забочусь о полной совместимости с машинами x86 / IBM.

Я следовал учебным пособиям по простым загрузочным кодам и с треском провалился, чтобы физически запустить их с моего USB на моем ноутбуке.Как будто моя записная книжка даже не касалась кода MBR.Я провел две недели, читая тонны статей, которые ни к чему не привели.Я многое узнал о блоках параметров BIOS, записях разделов, этой старой спецификации Phoenix BIOS и UEFI.

Мой ноутбук правильно загружается с моего загрузочного FreeDOS USB.Вот первый сектор моего FreeDOS USB с MBR: Хороший и полный реального полезного коди-кода

Я попытался загрузить его с настольного компьютера с UEFI, и это сработало.Я попытался загрузить его с ноутбука с BIOS Phoenix, и он заработал.

Затем я стер ВСЕ инструкции по загрузке: Красиво и полно НИЧЕГО, кроме одной записи раздела

Я попытался загрузить его с того же настольного компьютера с UEFI, и это не удалось, как ожидалось.Я попытался загрузить его с ноутбука с BIOS Phoenix, и это сработало.Я клянусь.

Я хочу знать, почему существует BIOS, который берет дела своими руками и пропускает инструкции MBR, если есть больше подобных и где я могу найти документацию по ним, чтобы я мог сделать свою загрузкукоды полностью совместимы со всеми BIOS.

Версия BIOS моего ноутбука - 1.08, а его версия EC - 1.07.Я не хочу его обновлять.Если FreeDOS нормально загружается, я хочу, чтобы мой загрузочный код тоже нормально загружался.

1 Ответ

0 голосов
/ 18 декабря 2018

Этот ответ основан на опыте и обоснованном предположении.Это довольно сложно проверить без реального оборудования.Я предполагаю, что OP записывает свой загрузочный сектор в MBR, а не VBR.


BIOS были созданы за эти годы, которые были глупыми и умными (некоторые слишком умные, IMHO).Некоторые пытаются различить носители, которые могут быть дисководами гибких дисков или жесткими дисками, основываясь на наличии блока параметров BIOS и / или таблицы разделов с загрузочным разделом.К сожалению, это не стандартизировано, и многие производители BIOS проверяют свой код только на дисках, разбитых на разделы Windows.

Некоторые BIOS, которые считают, что они видят действительную таблицу разделов, допускают эмуляцию жесткого диска и пытаются загрузить загрузочную запись тома (VBR).) из активного раздела, а не выполнять код в MBR.У меня есть подозрение, что это тот случай, когда машина все еще загружается, несмотря на обнуление кода и сохранение таблицы разделов.Выполненный код, вероятно, пришел непосредственно из VBR.

Если вы используете устройства, которые работают как жесткие диски (а не как дискеты), вы можете создать MBR с таблицей разделов, где единственный активный раздел начинается с началапривод (CHS = 0,0,1 или LBA = 0);помечен как загрузочный;и имеет ненулевой тип раздела.Если вы столкнулись с намерением компьютера загрузить VBR напрямую, этот метод обманул бы его загрузкой MBR как VBR.

Пример кода, который должен загружаться на ваш USB как жесткий диск на компьютерах, которые вы, похоже, тестируетеможет выглядеть так:

bits 16
org 0x7c00

boot_start:
    xor ax, ax                  ; DS=0 since we use ORG 0x7c00. 0x0000<<4+0x7c00=0x7c00
    mov ds, ax
    mov es, ax

    ; If you will be reading data into memory outside of 0x7c00 to 0x7dff
    ; then you want to set the stack SS:SP - uncomment these lines
    ; mov ss, ax                ; Stack at 0x0000:0x7c00
    ; mov sp, 0x7c00            ;     Just below bootloader

    cld                         ; Forward movement of string instructions
                                ;     (MOVSB, SCASB, etc)

    mov si, HelloWorldMsg       ; Print hello world
    call print_string

end_loop:                       ; Loop forever to terminate
    hlt
    jmp end_loop

; 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

HelloWorldMsg:   db "Hello, world!", 0x0d, 0x0a, 0

times 446-($-$$) db 0   ; Pad with 0s up until first partition entry
part1_entry:
db 0x80                 ; 0x80 = Active boot partition, 0x00=inactive
db 0x00, 0x01, 0x00     ; CHS of first absolute sector (MBR) of hard drive
                        ;     Head=0, Sector=1, Cylinder=0
db 0x0c                 ; Partition type (has to be non-zero)
                        ;     0x0c = Win 95 FAT32 (LBA)
db 0x00, 0x01, 0x00     ; CHS of last absolute sector (MBR) of hard drive
                        ;     Head=0, Sector=1, Cylinder=0
                        ;     We are effectively saying Size of partition is 1 sector
dd 0x0                  ; LBA of first absolute sector (0=MBR)
dd 0x1                  ; Number of sectors in partition. We set it to 1 but if you
                        ;     wish you could set it to the number of sectors on the disk

times 510-($-$$) db 0   ; Pad remainder of boot sector up to boot signature. This zeroes
                        ;     partition entries 2,3,4 effectively making them inactive

dw 0xAA55               ; The standard PC boot signature after partition table

Вы можете создать MBR с помощью:

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

При успешном размещении на носителе этот код должен напечатать:

Hello, мир!

...