Bochs не поддерживает AH = 42h на INT 13h при загрузке диска - PullRequest
1 голос
/ 26 июня 2019

Привет, я делаю загрузчик с адресацией LBA на Bochs.

При выполнении int 13h с AH = 42h терминал отображал следующую информацию.

00017480939i[BIOS  ] int13_diskette: unsupported AH=42
00017481022i[XGUI  ] charmap update. Font is 9 x 16
Next at t=17481022

Регистры передИнструкция int 13h выглядит следующим образом:

<bochs:3> reg
CPU0:
rax: 00000000_00004200 rcx: 00000000_00090001
rdx: 00000000_00000000 rbx: 00000000_00008000
rsp: 00000000_00007be8 rbp: 00000000_00000000
rsi: 00000000_000e7be8 rdi: 00000000_00007fe0
r8 : 00000000_00000000 r9 : 00000000_00000000
r10: 00000000_00000000 r11: 00000000_00000000
r12: 00000000_00000000 r13: 00000000_00000000
r14: 00000000_00000000 r15: 00000000_00000000
rip: 00000000_00007d94
eflags 0x00000202: id vip vif ac vm rf nt IOPL=0 of df IF tf sf zf af pf cf
<bochs:4> sreg
es:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
        Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
cs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
        Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
ss:0x0000, dh=0x00009300, dl=0x0000ffff, valid=7
        Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
ds:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
        Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
fs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
        Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
gs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
        Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
ldtr:0x0000, dh=0x00008200, dl=0x0000ffff, valid=1
tr:0x0000, dh=0x00008b00, dl=0x0000ffff, valid=1
gdtr:base=0x00000000000f9a37, limit=0x30
idtr:base=0x0000000000000000, limit=0x3ff

И 16-байтовый DS: SI, на который указывают:

<bochs:6> xp /16b 0x7be8
[bochs]:
0x0000000000007be8 <bogus+       0>:    0x10    0x00    0x01    0x00    0x00    0x80    0x00    0x00
0x0000000000007bf0 <bogus+       8>:    0x19    0x00    0x00    0x00    0x00    0x00    0x00    0x00

Возвращаемое значение на AH равно 0x01, и CF установлен.

Я использую диск в качестве опции загрузки и создал файл образа диска, часть моей конфигурации bochs выглядит следующим образом:

boot: disk
floppy_bootsig_check: disabled=0
# no floppya
# no floppyb
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="Boot.img", mode=flat, cylinders=0, heads=0, spt=0, model="Generic 1234", biosdetect=auto, translation=auto
ata0-slave: type=none

Моя платформа - Ubuntu 18.4, Bochs 2.6.9, и вот мой вариант конфигурации:

./configure --enable-plugins --enable-debugger --enable-disasm --enable-readline --enable-cpu-level=6 --enable-smp --enable-x86-64 --enable-avx --enable-a20-pin --enable-fast-function-calls --enable-all-optimizations --enable-x86-debugger --enable-alignment-check --enable-sb16

Теперь мой вопрос будет, как я могу включить опцию AH = 42h для BIOS.

Спасибо!

1 Ответ

3 голосов
/ 26 июня 2019

Большинство реальных компьютеров и Bochs поддерживают «расширения int 0x13» для большинства / более крупных устройств (жестких дисков, CD / DVD и т. Д.), Но не поддерживают его для дискет.

Регистры перед int 13h инструкции следующие:

rdx: 00000000_00000000

Это означает "DL = номер диска = 0x00 = первая дискета".

Теперь мой вопрос: как я могу включить опцию AH = 42h для BIOS.

Если вы намеревались получить доступ к первой дискете, используя «int 0x13 extensions»; тогда не надо (вам нужно написать собственную подпрограмму «LBA-> CHS», которая учитывает геометрию «вставленной после загрузки» дискеты).

Если вы намеревались получить доступ к жесткому диску, с которого вы загрузились, то очень рано во время запуска загрузчика вы хотите сохранить значение в DL («номер устройства, откуда пришел загрузчик»), который был передан в загрузчик, чтобы вы могли загрузить его обратно в DL для последующего чтения / записи на диск. Обратите внимание, что это значение не может быть 0x80 (например, любой менеджер загрузки решил загрузить ОС на второй жесткий диск) и (для разделенных жестких дисков) загрузчик также хотел бы хранить информацию о разделе, с которого он пришел (так он может выполнить «LBA = блок в моем разделе + LBA для первого сектора моего раздела» и проверить ограничения).

...