Изобретаем жесткий диск. Часть 6. Технологический режим.

Обмен данными с жестким диском производится через интерфейс IDE, SATA (или какой-либо другой) при помощи стандартизированных команд. Чтобы прочитать данные с диска достаточно использовать всего две команды: идентификации и, собственно, чтения. Первая нужна для получения размера диска и определения типа команды чтения, которая будет работать со всей поверхностью диска.

Если помните, то за историю своего существования жесткие диски преодолевали целый ряд ограничений емкости.

Некоторые из ограничений преодолевались добавлением новой команды чтения с адресом большей разрядности. Следовательно, из идентификации нужно узнать, какая команда чтения позволит получить доступ ко всей поверхности. Кроме стандартных команд, фирма-производитель дисков еще реализует и использует, так называемые, технологические команды. Их можно разделить на три больших класса:

  • информационные,

  • производственные,

  • диагностические.

Рассмотрим эти классы чуть более подробно.

Информационные команды позволяют получить более подробные (в сравнении со стандартом ATA) данные, например о том, из каких именно деталей собран диск, какие им заданы конфигурации и т. д.

Производственные команды выполняют настройку параметров, размечают/форматируют магнитную поверхность и т.д.

Диагностические используются для определения причины случившейся с диском неисправности. Это нужно фирме-производителю для изучения возвращенных по гарантии дисков.

Теперь попробуем нащупать у нашего подопытного признаки нестандартных технологических команд.

В прошлой части мы нашли и разбирали процедуру выдачи идентификации. В ней наблюдается вывод различного результата в зависимости от 7-ого бита некоего регистра byte_1A (на рисунке подсвечен желтым).

Отрывок дизассемблированного листинга прошивки WD21000

Рис. 1. Отрывок «формирование идентификации диска» дизассемблированного листинга прошивки WD21000

Ставим курсор на надпись byte_1A и нажимаем «x». Получаем список обращений к этому байту памяти:

Список обращений к переменной ""

Рис. 2. Список обращений к переменной «byte_1A»

Далее, просматриваем все инструкции изменяющие значения этого байта и ищем место, в котором устанавливается именно бит 7. Это инструкция по адресу ROM:86E0:

Рис. 3. Отрывок “sx_set_factory_mode” дизассемблированного листинга прошивки WD21000

Рис. 3. Отрывок “sx_set_factory_mode” дизассемблированного листинга прошивки WD21000

Называем это место «sx_set_factory_mode» и ищем откуда оно вызывается. А вот и место вызова:

Рис. 4. Отрывок “lc_cmd_E0_user” дизассемблированного листинга прошивки WD21000

Рис. 4. Отрывок “lc_cmd_E0_user” дизассемблированного листинга прошивки WD21000

Видно, что «sx_set_factory_mode» вызывается в случае, когда +4-ый байт команды равен 00, а +5 равен 0xE0. Тут я не рассказал, как именно мне удалось определить, что «ide_p4p5» содержит байты из параметров команды. Это не трудно установить, разбирая стандартные команды ATA примерно таким же способом, каким мы в прошлой заметке искали формирование сектора идентификации.

С параметрами команды более/менее ясно. Теперь, пробуем отыскать откуда вызывается эта часть, которую, забегая вперед, назовем «lc_cmd_E0_user».

Рис. 5. Отрывок “две таблицы вызовов” дизассемблированного листинга прошивки WD21000

Рис. 5. Отрывок “две таблицы вызовов” дизассемблированного листинга прошивки WD21000

Видно, что этот адрес вызывается не прямо из кода программы, а через таблицу адресов, которая обрабатывается в этой процедуре:

Рис. 6. Отрывок “sx_parse_cmd_Ex” дизассемблированного листинга прошивки WD21000

Рис. 6. Отрывок “sx_parse_cmd_Ex” дизассемблированного листинга прошивки WD21000

Видно, что таблица с адреса 56A4 вызывается если наш же искомый бит 7 = 0, а вот таблица 56C4, вызывается, когда бит 7 = 1.

Теперь попробуем определить, какой же код команды приводит к включению нашего бита? И тут нам везет! Если посмотреть, откуда вызывается функция формирования идентификации, то увидим это место:

Рис. 7. Отрывок “lc_cmd_EC” дизассемблированного листинга прошивки WD21000

Рис. 7. Отрывок “lc_cmd_EC” дизассемблированного листинга прошивки WD21000

И, оказывается, что вызов «lc_cmd_EC» идет из той же таблицы памяти (56C4)!

В инструкции «andb dword_1C, #0Fh» (в функции sx_parse_cmd_Ex) видно, что переход по таблице осуществляется по младшим 4-м битам и, что в списках адресов (56A4 и 56C4) чтение идентификации (команда 0xEC) находится на позиции 0x0C. Отсюда делаем вывод, что код нашей искомой команды = 0xE0.

Теперь проверим нашу догадку. Открываем ATA Commander и программируем команду:

Old WD factory mode on

Old WD factory mode on

Подаем ее. Диск ее выполняет без ошибки! Теперь читаем идентификацию и получаем результат:

Рис. 9. Разница между идентификационными данными.

Рис. 9. Разница между идентификационными данными.

Изменившиеся байты в сравнении с идентификацией с выключенным битом 7 подсвечены. Отсюда делаем вывод, что мы нашли, так называемую, команду «технологического ключа».

В следующих заметках темы «изобретаем жесткий диск» мы еще вернемся к разбору технологического режима.

Предыдущий пост серии:

Изобретаем жесткий диск. Часть 5. Дизассемблирование

Поделиться ссылкой на пост в соц. сетях

One thought on “Изобретаем жесткий диск. Часть 6. Технологический режим.

  1. Александр

    Наконец-то новая часть! 🙂

    P.S. У вас в комментах не работает логин через ВК, Яндекс и Гугл.

    Reply

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *