Как выполнить низкоуровневый ввод-вывод с флешки под BIOS (по сравнению с дискетой)? - PullRequest
6 голосов
/ 14 февраля 2009

Недавно я изучал код начальной загрузки, предназначенный для использования с флоппи-дисководом. Моя цель - изменить программу так, чтобы она использовала мою флешку. Теперь я вижу, как функция INT 13H использовалась с гибким устройством, но я думаю, что мой вопрос, как будет отличаться связь с USB-накопителем?

Например, вот фрагмент кода дискеты (ассемблер GNU):

</p>

<pre><code>    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. В моем конкретном BIOS я могу изменить порядок дисков, который будет включать в себя USB-накопитель. Я вполне уверен, что это становится зависимым от BIOS, но я думал, что порядок, указанный в BIOS, может соответствовать значению, которое я перемещаю в% dl. Мне нужно отследить некоторую документацию ...

Я действительно не знаком с работой с блочными устройствами, как она есть, может кто-нибудь указать мне хорошее место, чтобы начать изучать больше?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 25 августа 2010

Простой ответ заключается в том, что если BIOS может загружаться с флэш-накопителя USB, можно использовать те же функции BIOS для доступа к дискете / жесткому диску.

Счастливый ответ заключается в том, что простой метод позволяет одному и тому же коду загрузочного сектора получать доступ к образу дискеты на флэш-накопителе USB независимо от того, был ли он загружен с помощью эмуляции дискеты или эмуляции жесткого диска. Если дл = 80ч (эмуляция жесткого диска)

ПОЛУЧИТЬ ПАРАМЕТРЫ ПРИВОДА
int 13h, ах = 8
Возвращение:
ch = максимальный номер сектора (такой же, как количество секторов на дорожке)
dh = максимальное количество голов (просто добавьте 1, чтобы получить количество голов)

Эта возвращенная информация описывает геометрию эмулируемого устройства (если dl = 0, то это стандартная геометрия дискеты - 18 секторов на дорожку и 2 головки). Это может быть использовано для расчета необходимой информации о Секторе головки цилиндров для:

ЧИТАТЬ СЕКТОР (S)
int 13h, ах = 2

и

ЗАПИСЬ СЕКТОРА (S)
int 13h, ах = 3

См. Список прерываний Ральфа Брауна - int 13h

Смотрите мой пост здесь: Секреты загрузки с USB

3 голосов
/ 22 ноября 2010

Если BIOS «видит» USB-устройство как жесткий диск, оно присваивает ему номер. Назначенный номер начинается с 0x80 для первого жесткого диска, 0x81 для второго и т. Д. Таким образом, в зависимости от того, сколько жестких дисков установлено, ваш USB-накопитель будет иметь значение 0x81 или более. Также, если вы измените порядок в BIOS, номер USB-накопителя изменится, чтобы отразить это.

0 голосов
/ 14 февраля 2009

Флэш-накопитель доступен только в том случае, если его поддерживает BIOS. И если это произойдет, это, вероятно, позволит вам загрузиться с него уже. Большая часть этого выполняется с помощью эмуляции, поэтому вызовы для загрузки флэш-накопителя, вероятно, совпадают.

Я выгрузил блоки загрузки с моих флеш-накопителей и обнаружил форматы как гибких, так и жестких дисков.

Может быть, вам следует просто попробовать несколько номеров для доступа к дискам и посмотреть, какие из них отвечают.

Я думаю, что Google здесь твой друг. Начните с "INT 13H". И задавайте больше вопросов.

...