Как выполнить низкоуровневый ввод-вывод с USB-флешки под BIOS (по сравнению с дискетой)?
Недавно я изучал некоторый загрузочный код, который был предназначен для использования с флоппи-дисководом. Моя цель - изменить программу так, чтобы она использовала мою флешку. Теперь я вижу, как функция INT 13H использовалась с гибким устройством, но я думаю, что мой вопрос, как будет отличаться связь с USB-накопителем?
Например, вот фрагмент кода дискеты (ассемблер GNU):
movb $0x00,%dl /* select 1st floppy */
/* later */
movw sec,%cx /* get sector number */
movw head,%dx /* get head number */
movw $0x0201,%ax /* read 1 sector */
int $0x13
Теперь я прочитал, что перемещение 0x80 в%dl выберет первый жесткий диск в BIOS. В моем конкретном биосе я могу изменить порядок дисков, который будет включать в себя USB-накопитель. Я вполне уверен, что это становится зависимым от BIOS, но я думал, что порядок, указанный в BIOS, может соответствовать значению, которое я перемещаю в%dl. Мне нужно отследить некоторую документацию...
Я действительно не знаком с работой с блочными устройствами, как она есть, может кто-то указать мне хорошее место, чтобы начать изучать больше?
Спасибо!
3 ответа
Ответ прост: если BIOS может загружаться с флэш-накопителя USB, можно использовать те же функции BIOS для доступа к дискете / жесткому диску.
Удачный ответ заключается в том, что простой метод позволяет одному и тому же коду загрузочного сектора получать доступ к образу дискеты на флэш-накопителе USB независимо от того, был ли он загружен с помощью эмуляции дискеты или эмуляции жесткого диска. Если дл =80ч (эмуляция жесткого диска)
ПОЛУЧИТЬ ПАРАМЕТРЫ ПРИВОДА
int 13h, ах = 8
Вернуть:
ch = максимальное количество секторов (такое же, как количество секторов на дорожке)
dh = максимальное количество голов (просто добавьте 1, чтобы получить количество голов)
Эта возвращенная информация описывает геометрию эмулируемого устройства (если dl=0, то это стандартная геометрия дискеты - 18 секторов на дорожку и 2 головки). Это может быть использовано для расчета необходимой информации о Секторе головки цилиндров для:
ЧИТАТЬ СЕКТОР (S)
int 13h, ах =2
а также
НАПИСАТЬ СЕКТОР (S)
int 13h, ах =3
Смотрите список прерываний Ральфа Брауна - до 13 часов
Смотрите мой пост здесь: Секреты загрузки с USB
Если BIOS "видит" USB-устройство как жесткий диск, он назначит ему номер. Назначенный номер начинается с 0x80 для первого жесткого диска, 0x81 для второго и т. Д. Таким образом, в зависимости от того, сколько жестких дисков установлено, ваш USB-накопитель будет иметь значение 0x81 или более. Также, если вы измените порядок в BIOS, номер USB-накопителя изменится, чтобы отразить это.
Флешка доступна только в том случае, если ее поддерживает BIOS. И если это произойдет, это, вероятно, позволит вам загрузиться с него уже. Большая часть этого выполняется с помощью эмуляции, поэтому вызовы для загрузки флэш-накопителя, вероятно, совпадают.
Я выгрузил блоки загрузки с моих флэш-накопителей и обнаружил форматы как гибких, так и жестких дисков.
Может быть, вам следует просто попробовать несколько номеров для доступа к дискам и посмотреть, какие из них отвечают.
Я думаю, что Google здесь твой друг. Начните с "INT 13H". И задавайте больше вопросов.