Считывание данных с жесткого диска без BIOS прерывает бит DRQ, не установленный - PullRequest
0 голосов
/ 24 декабря 2018

ВАЖНО: этот код сделает носитель непригодным для использования без форматирования или восстановления.Используйте неиспользованный, пустой или ненужный носитель.

Должно быть прямолинейно реплицировать поведение функций прерывания BIOS, но информация об этом в Интернете является скудной в реальных сценариях использования.Поэтому я написал код для чтения 2,5-дюймовой информации идентификации жесткого диска, которая является функцией int 13h. Я получаю зависание на этапе проверки на бит DRQ (данные готовы для запроса?) Регистра состояния 0x1f7. Когда я комментируюВ цикле check-DRQ код продолжается, но все данные равны 0, возможно потому, что они не были прочитаны. Я пробовал варьировать ведомый и ведущий биты, а также первичную / вторичную шину ... Вторичная шина проходит проверку DRQно данные, кажется, все 1 с. Важно, что int 13h на одном и том же диске и на одной и той же машине работает нормально. Кто-нибудь знает, есть ли способ: a) узнать идеальное местоположение (основной / дополнительный, главный / подчиненный) жесткого дискато есть загрузка, а затем б) проверить его там без чтения из него, и в) выяснить, как вернуть бит DRQ в зеленый цвет? Будет ли регистр ошибок значимым до того, как DRQ выйдет?

Интересно, BIOS показывает3 жестких диска, кроме USB, DVD и LAN, но у меня есть только два слота для жестких дисков, и я никогда не смогу подключить свой жесткий диск, чтобы он был HDD1.zarre.Может ли это быть связано?

Вот мой загрузочный код для чтения с основного мастера жесткого диска ATA с использованием управляющих регистров и для вывода нескольких его байтов на экране в виде двоичных чисел:

[bits 16]
[org 0x7c00]
xor ax, ax
cli
mov dx, 0x1f7
m1:
in al, dx
test al, 010000000b
jnz m1
mov dx, 0x1f6
mov al, 0xE0       ; LBA mode - not needed for this?
out dx,al
mov dx, 0x1f7
m2:
in al, dx
test al, 010000000b     ; wait for BSY to be 0
jnz m2
test al, 001000000b     ; wait for DRDY to be 1
jz m2
mov dx, 0x1f7
mov al, 0xEC          ; identify drive command
out dx, al
mov dx, 0x1f7
m3:
in al, dx
test al, 010000000b
jnz m3
mov dx, 0x1f7
m4:
in al, dx
test al, 000001000b    ; this test for DRQ never turns 1
jz m4
mov ax, 0
mov es, ax
mov di, 0x7e00       ;save the identification to 0x7e00
mov dx, 0x1f0
mov cx, 256
rep insw
mov ax, 0xb800     ; display in table of binary bytes
mov es, ax
mov di, 0
mov ax, 0
mov ds, ax
mov si, 0x7e00     ;starting RAM address to read
mov cx, 0
mov dl, 20      ;how many lines to print
morelines:
mov bh, 7      ;how many bytes per line
morebytes:      
mov ah, [ds:si]
mov bl, 8       ;counter for bits of each byte to print
morebits:
shl ah, 1
mov al, 48
jnc zero
mov al, 49
zero:
mov [es:di], al
inc di
inc di
dec bl
jnz morebits
mov al, 32
mov [es:di], al
inc di
inc di
inc si
dec bh
jnz morebytes
add cx, 80*2
mov di, cx
dec dl
jnz morelines
times 510 - ($ - $$) db 0
dw 0xaa55

Ответы [ 2 ]

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

Должно быть просто реплицировать поведение функций прерывания BIOS, но информация о нем в Интернете является скучной в реальных сценариях использования.

Нет, определенно нет.

Например, чтобы воссоздать (относительно ужасный и сломанный из-за исторических ограничений и «тратить время ЦП на завершение ввода-вывода, когда есть лучшие вещи, которые ЦП может сделать» дизайн идиотизм) int 0x13 интерфейса, для которого вам потребуется код:

  • устаревшие / контроллеры гибких дисков ISA, дисководы гибких дисков, ленточные накопители
  • устаревшие контроллеры / ISA "параллельные ATA", дисководы ATA и компакт-диски ATAPI
  • около 50 различных устаревших версийRAID-контроллеры / ISA "Parallel ATA"
  • 80 различных устаревших контроллеров / ISA SCSI
  • 3 различных USB-контроллера, USB-дисковод гибких дисков, запоминающие устройства USB
  • SATA / AHCI
  • около 20 различных контроллеров PCI SCSI
  • около 30 различных контроллеров PCI (SATA, SAS)
  • NVMe
  • a bunch кода перечисления устройств (например, для сканирования шин PCI и выяснения, какие устройства есть и т. д.)
  • все зависит от всего вышеперечисленного (например, управление памятью, обработка IRQ и т. д.)

Это добавляет больше кода, чем умещается в 512-байтовом загрузчике, что вызывает вопрос: «Если вы можете использовать BIOS для загрузки кода, необходимого для работы с устройством, почему вы не можете использовать BIOS для загрузки коданеобходимо запустить ядро ​​и обычные драйверы устройств, которые не работают? ".

Обратите внимание, что в большинстве этих случаев (например, для всех SCSI, всех RAID) BIOS просто использует ПЗУ, предоставленное производителем устройства, ивключены в их ISA / PCI-карту, чтобы в самой BIOS не было собственного кода для устройства.

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

Возможно, вы работаете с дисководом DVD, подключенным к порту SATA0 вместо жесткого диска.В этом случае команда 0xA1 (IDENTIFY PACKET DEVICE) вернет идентификационные данные.

Для портов SATA1 - SATA3 попробуйте установить бит 4 (выбор привода) регистра 0x1F6 или использовать регистры 0x170 - 0x177, как предложено@ rcgldr.

...