Phoenix BIOS пропускает код MBR, что является ФАКТИЧЕСКИМ стандартом BIOS?

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

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

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

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

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

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

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

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


person Antonio de las Carreras    schedule 17.12.2018    source источник
comment
Из того, что вы говорите, я предполагаю, что вы загружаете этот USB-накопитель с эмуляцией жесткого диска (HDD), а не с эмуляцией гибкого диска (FDD).   -  person Michael Petch    schedule 18.12.2018
comment
С эмуляцией жесткого диска USB некоторые BIOS фактически будут читать таблицу разделов из первого сектора (MBR), находить активную запись, а затем автоматически загружать первый сектор тома (VBR) и запускать его вместо кода в MBR. Вполне вероятно, что с Freedos первый сектор раздела - это фактический запускаемый код. Это просто дикая догадка.   -  person Michael Petch    schedule 18.12.2018
comment
У разных производителей система BIOS работает по-разному, и, к сожалению, ситуация может быть несколько случайной. Один из способов увеличения шансов загрузки через USB-жесткий диск и запуска кода в MBR - это фактическое создание таблицы разделов, в которой активный раздел указывает на саму MBR, а не на загрузочную запись тома (VBR).   -  person Michael Petch    schedule 18.12.2018
comment
Привет @MichaelPetch, вы правильно поняли. Этот BIOS может эмулировать только USB-жесткий диск, его нельзя настроить. Я также предположил, что VBR запускается напрямую, а также подумал о том, чтобы исправить это с помощью перехода к MBR, чтобы максимизировать совместимость между BIOS. Но теперь я хочу знать, существует ли список в книге или статье со всем известным поведением загрузки BIOS, чтобы я мог убедиться, что мой код не выйдет из строя на следующей машине, которую я подключу. Как разработчики FreeDOS узнали об этом поведении существует, чтобы сделать такое обходное решение? Или вы думаете, что это было простым совпадением, потому что это стандартная процедура, чтобы сначала загрузить VBR?   -  person Antonio de las Carreras    schedule 18.12.2018
comment
Когда дело доходит до жестких дисков, люди (включая, как мне кажется, Фридоса) создают базовую загрузочную MBR (загрузочную загрузку MBR), которая просматривает таблицу разделов и находит активную запись. Затем он копирует себя (512 байтов по адресу 0x0000: 0x7c00) в нижнюю память (часто в 0x0000: 0x0600). Затем он переходит к самому себе в перемещенной памяти. Затем он считывает (используя Int 13h) загрузочную запись тома по адресу памяти 0x0000: 0x7c00. Он устанавливает DS: SI в начало активной таблицы разделов, которая была загружена, устанавливает DL в загрузочный диск (переданный BIOS), а затем дальний JMPS на 0x0000: 0x7c00, который является кодом VBR.   -  person Michael Petch    schedule 18.12.2018
comment
Если вы это сделаете, тогда, если BIOS считывает VBR активного раздела и переходит к нему за вас, тогда VBR запускается напрямую. В противном случае выполняется описанная выше MBR, которая загружает VBR из активного раздела и передает ему управление. В обоих случаях основной точкой входа является VBR, а не MBR для любого кода, связанного с ядром / ОС.   -  person Michael Petch    schedule 18.12.2018
comment
И нет, это плохо документировано в одном месте и основано на информации, распространенной в Интернете. У osdev.org есть некоторая информация на своих вики-страницах и на форуме, но опять же, не все они собраны в одном месте. Вот почему многие люди используют загрузчик, такой как GRUB, чтобы решить все эти проблемы.   -  person Michael Petch    schedule 18.12.2018
comment
Да, вики-сайт osdev довольно хорош, но ближайшая проблема BIOS, которую она решает в отношении проблем с загрузкой, заключается в том, что она может выполнять дополнительные проверки, помимо проверки на 0x55AA (например, проверку действительной таблицы разделов). Но все источники, похоже, соглашались с тем, что рано или поздно загрузочный код MBR будет загружен и выполнен. GRUB отлично подходит для загрузки ОС, но я просто хочу запустить одну программу сборки, а не всю ОС. Что ж, думаю, я продолжу работать над этим исправлением и надеюсь, что не столкнусь с другой проблемой такого же характера. Большое спасибо @MichaelPetch за помощь и внимание.   -  person Antonio de las Carreras    schedule 18.12.2018


Ответы (1)


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


За долгие годы были созданы BIOS, которые были глупыми и умными (некоторые слишком умными, ИМХО). Некоторые пытаются различить носитель, которым может быть дисковод гибких дисков или жесткий диск, на основе наличия блока параметров 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

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

Привет, мир!

person Michael Petch    schedule 18.12.2018
comment
Еще раз привет, Майкл, я хочу сообщить вам, что мне нужно запустить свой ассемблерный код, записав его в VBR. Но все было не так просто. Фактически причина, по которой это было не так просто, заключается в той же причине, по которой ваш приведенный выше код все еще не работал на моем ноутбуке. Причина в следующем: мой BIOS не только проверяет правильность таблицы разделов, он также загружает первый сектор первого активного раздела и проверяет наличие VALID FS HEADER для раздела (действительно, слишком умно ›: C). Только ТОГДА он соизволит запустить загрузочный код на VBR (где я написал свою программу) Src: ссылка - person Antonio de las Carreras; 20.12.2018
comment
Если вам интересно: моя программа должна была быть загружена по адресу памяти 0x7C5A (если я хорошо помню), что означало, что я должен был сначала написать org 0x7C5A. Затем мне пришлось скопировать скомпилированный двоичный файл сразу после заголовка FS на мой USB VBR, и все. Получил, работает, boiii: D - person Antonio de las Carreras; 20.12.2018
comment
@AntonioDelasCarreras Похоже, ваш BIOS также ожидает блок параметров BIOS, а также таблицу разделов (если кто-то пытается использовать метод саморегулирования). Это реальная возможность, но я хотел попробовать кое-что в процессе исключения, чтобы улучшить ответ. Можете ли вы загрузить эти два файла отсюда: capp-sysware.com/misc/osdev/ test1. Затем выполните сборку с nasm -f bin boot.asm -o boot.bin и попробуйте записать его в MBR вашего диска? Спасибо - person Michael Petch; 20.12.2018
comment
Не беспокойтесь о коде в вашем ответе. Мой вопрос был не столько в том, что я хочу решить мою конкретную проблему. но я хочу знать, где найти документацию по всему диапазону поведения BIOS. Вы уже дали мне ответ, который я хотел, когда вы ответили. Это не стандартизовано, и многие производители BIOS проверяют свой код только на дисках, разделенных Windows. (Плюс один из ваших комментариев к моему вопросу: это плохо документировано в одном месте и основано на информации, распространенной в Интернете) - person Antonio de las Carreras; 20.12.2018
comment
@AntonioDelasCarreras: Я понимаю это, я просто хотел бы знать, что происходит с моими собственными записями. - person Michael Petch; 20.12.2018
comment
Да, конечно. Я прокомментирую результаты здесь, как только запущу ваш код. Если когда-нибудь вы найдете документацию по Phoenix BIOS v1.08, поделитесь ею и со мной. - person Antonio de las Carreras; 20.12.2018
comment
И результаты aaare ...: Ноутбук полностью проигнорировал это: Операционная система не найдена. - person Antonio de las Carreras; 21.12.2018