Емкость чтения SCSI (10) сообщает о неправильном LBA и размере сектора

Я пытался протестировать драйвер AHCI для ОС для хобби на «голом железе». Перед этим я протестировал свой драйвер в QEMU с параметрами:

qemu-system-i386 -boot d -cdrom elfboot.iso -machine q35 -m 2G -hda hda.img -serial stdio

Вывод примерно такой:

...
PCI: 00:1F.2 [0106] (01): 8086:2922 Mass Storage Controller
...
AHCI: Initialize module...
...
AHCI: Found AHCI device with signature EB140101
AHCI: ahci2: sectors = 204, block size = 2048
DEV: Added block device ahci2
...

Устройство PCI — это контроллер AHCI, который используется при запуске QEMU с указанными выше параметрами. Теперь я был достаточно уверен, что такая же установка будет работать и на реальном оборудовании, поэтому я попробовал. Вот что было напечатано на экране:

...
PCI: 00:17.0 [0106] (01): 8086:A102 Mass Storage Controller
...
AHCI: Initialize module...
...
AHCI: Found AHCI device with signature EB140101
AHCI: ahci1: sectors = 4068212736, block size = 0
DEV: Added block device ahci1
...

Я также протестировал его на другой машине, на которой нет контроллера AHCI, но есть контроллер RAID, работающий в режиме AHCI. На этой машине вывод в основном такой же, как и на другой настройке «голого железа»:

...
PCI: 00:17.0 [0104] (00): 8086:282A Mass Storage Controller
...
AHCI: Initialize module...
...
AHCI: Found AHCI device with signature EB140101
AHCI: ahci1: sectors = 4068212736, block size = 0
DEV: Added block device ahci1
...

Согласно спецификации SCSI значение 4068212736 (0xF27C0000) не имеет заданного значения. Кроме того, размер блока установлен равным нулю, что не соответствует тому, что я вижу в QEMU. Только вывод, показанный в консоли QEMU, является правильным. На обеих моих реальных машинах заявленная емкость неверна с одинаковыми значениями.

Что мне делать дальше? Это проблема поставщика? Похоже, что команда read capacity (10) обязательна для всех SCSI-устройств этого типа, так что, по моему неопытному мнению, проблема здесь не в этом.

РЕДАКТИРОВАТЬ: я поместил значение запроса SCSI после команды чтения емкости (10), так как было указано, что значение запроса следует помещать после каждой команды SCSI для остановки устройства.

Теперь сообщаемое количество блоков равно 65263, что по-прежнему неверно, но также отличается от 4068212736, поэтому я не уверен, двигаюсь ли я сейчас в правильном направлении. Кроме того, размер блока теперь правильно отображается как 2048 байт.


person CRoemheld    schedule 19.05.2020    source источник


Ответы (1)


Ответ READ CAPACITY (10) представляет собой два 32-битных целых числа без знака с обратным порядком байтов (сетевой порядок байтов) для последнего LBA и размера блока. Проблемы, с которыми вы столкнулись, выглядят так, будто они связаны с порядком байтов. Я думаю, что самый высокий LBA действительно равен 0x00007CF2. Размер блока отображается как 0, потому что он находится в байте на другом конце целого числа и был усечен.

person Mike Andrews    schedule 20.05.2020
comment
К сожалению, здесь не в этом дело. Я знаю, что результат отправляется обратно с обратным порядком байтов, но я использовал небольшую функцию, которая в таких случаях меняет порядок байтов на противоположный. Кроме того, 0x7CF2 не является правильным LBA для последнего блока. Правильный LBA для последнего блока — 204, то есть 0xCC. И этот байт нигде не появляется в сообщаемом поле последнего блока. - person CRoemheld; 20.05.2020