Внимание! Это временный неофициальный архив старой версии форума Полигон Призраков, созданный сочувствующим форуму участником. Этот сайт просуществует лишь до тех пор, пока администрация Полигона не сдержит своё обещание и не откроет официальный архив по адресу old.sannata.org.

Полигон-2

Форум о старых компьютерах

Объявление форума

Если пользуетесь личными сообщениями и получили по электронной почте оповещение о новом письме, не отвечайте, пожалуйста, почтой. Зайдите на форум и ответьте отправителю через ЛС.

Полигон-2 »   Документация »   Програмный ремонт жёстких дисков HDD
RSS

Програмный ремонт жёстких дисков HDD

Програмный (и не только) ремонт классических жёстких дисков HDD /Seagate /Samsung /IBM /Hitachi /HGST /Western Digital

<<Назад  Вперед>> Страницы: 1 2 3 4 5 ... 43 44 45 46 47 * 48 49 50 51 .. 75 76 77 78 79 80
Печать
 
KALDYH
Advanced Member
Технонекромант

Откуда: Кемерово
Всего сообщений: 2355
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
5 июня 2009
На этом я, пожалуй, закончу свои исследования коннеров. Осталось только выложить результаты и проект для тех, кто желает покопать его за меня дальше.
Вот образ памяти, с которым я работал: https://drive.google.com/file/...sp=sharing
Файл проекта IDA: https://drive.google.com/file/...sp=sharing

Дамп снимал программой https://drive.google.com/file/...sp=sharing под досом , в принципе можно написать тупой скрипт побайтового чтения для ST_MEM.

Аппаратная часть

Плата Conner семейства Jaguar состоит из следующих компонентов:
  • Интерфейсный контроллер Cirrus Logic CL-SH359-32QC-A или CL-SH360-32QC-B. Возможности:
    - 4 уровня энергосбережения
    - скорость чтения-записи до 32 Мбит/с
    - взаимодействие с МК по опросу портов или по прерываниям
    - гибкий настраиваемый форматтер
    - чтение всей дорожки без участия микроконтроллера
    - дисковый буфер до 64 кб с настраиваемой сегментацией (на плате распаяно 32 кб в виде микросхемы LC36256-70, рядом есть место для второй такой же), скорость обмена до 12 Мбит/с
    - Интерфейс IDE XT/AT, режим PIO или DMA до 4 Мслов/с
    - обработка дефектов на уровне заголовков секторов
    - 16 бит CRC и 88 бит ECC
  • Микроконтроллер Motorola SC415111FU (заказной, даташита нет). Система команд 68HC11, корпус QFP-68.
  • ПЗУ 27C512, корпус PLCC-32, масочное либо однократное.
  • заказной драйвер шпиндельного двигателя 61153-002 (пр-во ST) с внешними силовыми ключами
  • заказной канал чтения-записи 61431-001 (PCA808HCG)
  • пара заказных чипов неустановленного назначения, 61216-1 (пр-ва Cirrus Logic, скорее всего тактовый генератор) и 61189-001 (пр-ва NCR)

Краткое введение в процессорную архитектуру Motorola 68HC11

Семейство МК было представлено в 1985 году, представляет собой дальнейшее развитие 6800. Архитектура - фон-неймановская, что необычно для МК. Адресное пространство - 64к, порты ввода-вывода мапятся на память. Регистры:
- два 8-разрядных аккумулятора A и B, которые могут объединяться в один 16-разрядный регистр В
- два 16-разрядных регистра X и Y
- 16-разрядные регистр стека SP и счётчик команд PC
Набор команд - типичный. Есть целочисленные умножение и деление. Набор периферии - типичный: порты, таймеры, UART (SCI), прерывания. Внутрення память может включать в себя области ROM, RAM, EEPROM, конкретное расположение областей зависит от модели. Особенность - первые 256 байт памяти могут использоваться для быстрого доступа (два байта на команду: 1 байт команда и 1 байт адрес).

Карта адресного пространства

По итогам анализа была получено следующее распределение адресов:
00-BF - регистры ввода-вывода (внешние и внутренние), назначение отдельных регистров (кроме управления EEPROM) не установлено. Мнемоники в проекте взяты от другого МК "от балды".
С0-17F - регистры контроллера CL-SH359, соответствуют адресам 40-FF в даташите. Имена вбиты оттуда.
180-FFF - не используется (читается состояние пустой шины)
1000-13FF - внутреннее ОЗУ (объём 1024 байт). Занято переменными примерно до адреса 1151, далее ссылаются только отдельные указатели. В конце находится стек.
1400-1DFF - не используется (читается состояние пустой шины)
1D00-1FFF - внутренний EEPROM (512 байт). Хранит некоторые переменные, (Age, Type и т.п.), пользовательские пакетные файлы и адаптивы.
2000-FFFF - внешнее ПЗУ. Начинается со строки копирайта. ПЗУ имеет объём 64 кбайт, что равно всему адресному пространству, и как бы "подлежит" под ним - область выше 2000 в чипе ПЗУ ничем не занята, кроме адресов ОЗУ - в них содержатся стартовые значения для инициализации. ПЗУ занято не полностью - в хвосте нули. С адреса FFC8 находится таблица прерываний.
Найти стандартный микроконтроллер с таким же распределением адресного пространства не удалось.

Методика дизассемблирования

Работать с IDA я не умею, поэтому учился на ходу. Действовал так:

Запускаем IDA, выбираем Disassemble a new file. Выбираем считанный 64кб дамп. Выбираем тип процессора Motorola MC6811, остальное не трогаем, нажимаем OK. На следующей странице также нажимаем ОК. Далее нужно выбрать модель микроконтроллера. Подходящего по параметрам там нет (я попытался написать свой конфиг, но не преуспел), поэтому просто нажимаем Cancel. Я первоначально выбрал произвольный наобум, как показала дальнейшая деятельность - не угадал.

Наконец получаем листинг. IDA проводит первичный автоанализ от вектора сброса и находит в нём некоторые функции (выделены голубым и красным), но большая часть дампа в полоске карты раскрашена серым цветом - это данные и цветом хаки - это нераспознанные области. Пора вручную найти всё остальное.

Прежде всего разворачиваем свёрнутые в массивы блоки данных. Ставим курсор на блок и нажимаем U. Неопределённые данные в автокомментариях имеют расшифровку своего значения в ASCII - это нам пригодится.

Прячем неиспользуемые блоки. Выделяем их (курсор на начало, Alt+L, курсор на конец) и из меню View - Hide. Можно также временно спрятать крупные блоки данных.

Переключаемся на вкладку Hex View и визуально находим в нём тестовые строки. Устанавливаем курсор на начало блока и переключаемся обратно в IDA View. Выделяем строку от начала до конца и нажимаем A - строка преобразуется в текстовую константу с автосгенерированным именем. Проходим таким образом по всем дампу.

Замечание: Формат срок - сишные, нуль-терминированные (выделять вместе с нулём). Большинство строк оканчиваются кодом перевода строки $D. Переменные в выводимую строку вставляются управляющими кодами:
02 xx - напечатать байт переменной xx от смещения 1000
06 xx - то же самое, без лидирующих нулей
08 xx - вывести байт как символ

Ну а теперь ищем код.
Замечание по структуре программы: массивы и строковые константы располагаются сразу за подпрограммой. Большинство подпрограмм оканчиваются командой rts - это байт $39 или rti - $3B
Ставим курсор на любой неопределённый блок и нажимаем C - IDA разворачивает этот участок и всё, на что ведут переходы, в код. Разворачиваются целые блоки, так что процесс идёт быстро. Смотрим, похоже получилось или непохоже. Если на что-то осмысленное непохоже - разопределяем обратно клавишей U. Для быстрого перехода далее используйте Ctrl-U

Пройдясь так по всему дампу, находим большую часть кода и относящихся к нему данных (на них появятся метки). Теперь займёмся кодом. Смотрим на слова, подсвеченные красным (о байтах позже). Как известно, регистры X и Y - индексные, поэтому то, что грузится в них командами ldx и ldy - скорее всего указатели. Если навести мышь на число, показывается, куда он ведёт. Ставим курсор на слово и нажимаем O - значение преобразуется в указатель. Делаем так для всего, что похоже на указатели в ПЗУ (числа более 2000) и в ОЗУ/EEPROM (от 1000 до 2000), более мелкие пока не трогаем.

Далее займёмся байтами.
Замечание: для работы с переменными в ОЗУ в подавляющем большинстве случаев используется индексная адресация через регистр X, который большую часть времени хранит константу $1000.
Исходя из этого, увидев команду с аргументом вида $число, x можно с уверенностью утверждать, что на самом деле она ссылается на адрес ($1000+$число). Как показать это наглядно? Ставим курсор на байт, нажимаем Ctrl+R. Выставляем Type - OFF16, Base Address - 0x1000. Адресу 1000 для удобства дадим какую-нибудь метку, например RAM.

Напоследок заглянем в область переменных. Ставим курсор на все по очереди и нажимаем X. Если на неё ссылаются в основном команды, работающие с регистрами d, x, y - это слово, если a и b - это байт. Выбираем нужный тип клавишей D.

Попробуем определить назначение некоторых функций. Видим, например, что на текстовые строки ссылается команда ldd $DEAD, и сразу за ней идёт jsr sub_BEEF (адреса, разумеется, для примера). Очевидно, что это процедура печати в терминал! Перейдём к ней двойным кликом или Enter и поищем ещё её вызовы комбинацией Ctrl+X. Видите, сколько их много? Теперь можно переименовать её кнопкой N во что-нибудь более понятное и привычное.

Про что ещё рассказать? Явные массивы для компактности листинга лучше так и пометить (кнопка в панели инструментов). Разбор кода удобнее вести, давая комментарии (кнопки ":" и ";").

Структура исследовааной микропрограммы Jaguar - 4HT2.61

Информация о диске, извлечённая из прошивки
Дорожек - 0x717
Головок - 0x04
Секторов - 0x2E
Микропрограмма подходит к следующим моделям:
Тип A0 - 4 головы, 716h дорожек
"Conner Peripherals 170MB - CP30171E " feature бит 1 = 1
"Conner Peripherals 170MB - CP30174E " feature бит 1 = 0
Тип A1 - 4 головы, 514h дорожек
"Conner Peripherals 120MB - CP30121E " feature бит 1 = 1
"Conner Peripherals 120MB - CP30124E " feature бит 1 = 0
Тип A2 - 2 головы, 716h дорожек
"Conner Peripherals 85MB - CP30081E " feature бит 1 = 1
"Conner Peripherals 85MB - CP30084E " feature бит 1 = 0, feature бит 40 = 0
"Conner Peripherals 80MB - CP30084E " feature бит 1 = 0, feature бит 40 = 1


Зонного распределения, предположительно, нет (по графику чтения не проверял)
Системные дорожки - 4..7, начиная с 8 идут пользовательские
Кодовых оверлеев нет
Калибровки и адаптивы хранятся в EEPROM
Буферы образуют отдельное адресное пространство, микроконтроллер имеет доступ к нему только через порты цирруса.

Переменные:
(для удобства - только последний байт)
00 - Pgm
01 - error code
02 - Pwr error
03 - Type
04,05 - Health
06,07 - Features
08,09 - состояние шпинделя
14,15 - текущий сектор
16,17 - временный регистр X
18,19 - Cyl
1A - Head
1B - Sect
1C,1D - Sec Count
1E,1F - Rel
20,21 - Xfr
22,23 - Err
26 - Ef
27 - Rw
2A - Spin lock
2C - State flags
2E,2F - Max cyl
30,31 - Min cyl
32 - Max head
35,36 - цилиндр, на который нужно спозиционироваться
37 - ...головка
38 - ...сектор
3D,3E - Spin
4D - Servo Gain
4E - AB
50 - Itg
58 - Offtrack error
59 - GC err
5C,5D - Grey
61 - Servo Threshold
68 - CD
8B - Rf
89,8E,8F,90 - Retry control (rd.hdr.wrt)
92 - Rc
93 - Mf
94 - Error log num
95 - выводимый level
96,97 - внутрикомандная временная переменная
98,99 - второй операнд команды
9A,9B - третий операнд команды
9С - флаг проверки вызова команды:
1 - foreground прерван
2 - есть первый аргумент
4 - есть второй аргумент
A0,A1 - адрес для поиска в памяти скорее всего, временная переменная
A2 - test space
A3 - error.3
AE - display flags
E0-F0 - какой-то временный массив на 16 байт

Данные в EEPROM
Каждая байтовая переменная хранится в трёх байтах. Первый байт как есть, второй - инвертированный байт, третий - XOR AA (10101010). Полагаю, сделано для надёжности и помехозащищённости.
1E00 - Age
1E03 - Type
1E06 и 1E09 - Feature (старший и младший байты соотв.)
1E10 и 1E13 - Health
Далее идут константы:
1E20-1E3F - массив адаптивов (16 слов)
1E40-1E6A - серийник
1E82-1E8E - Barcode S/N
1EF0-1EFA - PCB S/N
С адреса 1F00 и до конца располагается место для пользовательских пакетных файлов.

Таблицы
Найденные массивы табличных данных (как их оформлять в структуры - я не разобрался):

Команды:
889D - таблица переходов по уровням. Записи по 4 байта: первый - вводимый номер уровня, второй - выводимый в строке приветствия символ, 3-4 - указатель на таблицу команд данного уровня минус 3 (цикл поиск в таблице пред-инкрементный, поэтому минус)

883D - команды для всех уровней
8995 - команды уровня 1
8C9E - команды уровня 2
92C2 - команды уровня 3
A423 - команды уровня 4
ABBE - команды уровня 6
AEFA - онлайн-команды
B406 - команды уровня T
Записи по 3 байта: байт символа команды, за ним слово адреса вызываемой подпрограммы.

Селфскан
7B3F - последовательность тестов селфскана (массив 40h байт)
7B7F - массив 41h указателей на последовательности подпрограмм для каждого номера теста (нумерация линейная, от 0 до 40)

Прочие
A237 - массив указателей на текстовые строки расшифровки битов ошибок. Сами строки - сразу за ним.
B537 - таблица расшифровки битов health. Элементы по 4 байта: битовая маска, затем 0, потом ссылка на строку расшифровки.
6D33 - таблица типов накопителя (указатель на неё ведёт на 4 байта раньше). Элементы по 4 байта: байт типа, байт числа головок, слово числа дорожек.
DAB3 - выводимые в паспорте имена моделей

Подпрограммы
Передача параметров в функции - через регистры, если часть параметров не вмещается - через переменные.

Процедуры обработки команд
На входе: регистровая пара d - первый аргумент, переменные 98 и 9A - второй и третий. Наличие аргументов проверяется анализом битовой переменной 9С.
На выходе: d - указатель на выводимое сообщение об ошибке либо a - код ошибки.

Подпрограммы ввода и печати
Находится по адресу 2506, еще одна - по адресу 25F0
На входе: d - указатель на начало выводимой строки. Формат строк - см. выше.
Связанные подпрограммы:
2434 - приём одиночного символа, результат - в регистре a
2459 - печать одиночного символа из регистра a
2549 - использует входной регистр x
25F9 - помещает сообщение по адресу d в очередь на вывод

Контрольная сумма
ПЗУ защищено контрольной суммой. Считается по адресам 1000-1200, 1E00-2000 и 2000-FFFF вместе.

В процессе дополнения...
strelec
Newbie


Откуда: Кемерово
Всего сообщений: 105
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
3 апр. 2018
Приветствую.
Винт seagate 7200.10 , NHPLUS2HD.
Запустил селф с N2.На 13 тесте долго не реагировал на"."
Подумал, что завис.Передернул питание, селф не стартовал после подачи питания.
Выходит только на уровень F>Pgm=00 Trk=0001690A(0001690A[0180F8]).0(0).01E(01E) Zn=FF Err=00 ErCt=0000 Hlth=0000 CHlth=0000 Ntrdy LBA=00000000.
Как правильно запустить селф опять?
KALDYH
Advanced Member
Технонекромант

Откуда: Кемерово
Всего сообщений: 2355
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
5 июня 2009
strelec, посылаем ему App по кабелю, считываем системный сектор, проверяем - Age должен показывать 13, cert code и cert table должны быть на месте.
strelec
Newbie


Откуда: Кемерово
Всего сообщений: 105
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
3 апр. 2018
KALDYH,
запустился.Спасибо.
У диска наработка была более 60т.ч. Переназначенных секторов ок. 100.
Интересно, пройдет или нет селф с таким пробегом )
i8088
Advanced Member


Откуда: г. Баку, Азербайджан
Всего сообщений: 2132
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
30 янв. 2015
KALDYH, отличное расследование Conner-ов, спасибо! Думаю, мне очень пригодится!

strelec, а какое бвло состояние Вашего коршуна до скана?
strelec
Newbie


Откуда: Кемерово
Всего сообщений: 105
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
3 апр. 2018
i8088,
К сожалению, не сохранил смарт.
Винт, похоже работал в организации круглосуточно.
Чтение-запись приличная в начале диска.Но провалы есть.Даже
не стал прогонять весь диск.Не терпелось запустить скан!))
strelec
Newbie


Откуда: Кемерово
Всего сообщений: 105
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
3 апр. 2018
NHPLUS2HD селфскан прошел успешно.Все тесты пройдены
без ошибок[Log 4E - Health 0000 - HlthDtl 0000].
Чтение -хорошо.
При записи есть "зеленые" блоки.Около 60шт.
Прогнал пару раз. Смотрю в сторону команды G7,3.
Оставить как есть или пробовать запускать скан с N2 еще раз?
i8088
Advanced Member


Откуда: г. Баку, Азербайджан
Всего сообщений: 2132
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
30 янв. 2015
strelec написал:
[q]
NHPLUS2HD селфскан прошел успешно.Все тесты пройдены
[/q]
Поздравляю! Насколько я понял из чтения форумов, коршуны чаще других заваливают скан,
те хорошо что прошел, и притом с нулевым Health 0000.

Я бы оставил как есть (да и жалко мучать еще раз видавшую виды механику), а если блоки с задержками появляются
в разных местах, то вообще не проблема. G7,3 не повредит, но сразу после успешного скана думаю смысла в ней нет.
Запись с проверкой задержек я вообще не проверял никогда.

А на верификации он как, он дает неравномерный график чтения или пониженную скорость (здесь писалось что для них
так нормально)?
KALDYH
Advanced Member
Технонекромант

Откуда: Кемерово
Всего сообщений: 2355
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
5 июня 2009
i8088 написал:
[q]
Насколько я понял из чтения форумов, коршуны чаще других заваливают скан
[/q]
А из моего личного опыта - всё успешно (правда, я всегда делаю с самой новой из всех прошивок).

i8088 написал:
[q]
(да и жалко мучать еще раз видавшую виды механику)
[/q]
Тю, ей в обыденной работе гораздо больше достаётся.
strelec
Newbie


Откуда: Кемерово
Всего сообщений: 105
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
3 апр. 2018
i8088 написал:
[q]
а если блоки с задержками появляются
в разных местах, то вообще не проблема.
[/q]
Так и есть.

i8088 написал:
[q]
А на верификации он как, он дает неравномерный график чтения или пониженную скорость (здесь писалось что для них
так нормально)?
[/q]
Действительно, график на [verify] скачет достаточно сильно.На [read] плавный, без провалов.

Ну значит, не буду мучить, раз лучше не станет.
<<Назад  Вперед>> Страницы: 1 2 3 4 5 ... 43 44 45 46 47 * 48 49 50 51 .. 75 76 77 78 79 80
Печать
Полигон-2 »   Документация »   Програмный ремонт жёстких дисков HDD
RSS

0 посетителей просмотрели эту тему за последние 15 минут
В том числе: 0 гостей, 0 скрытых пользователей

Последние RSS
[Москва] LIQUID-Акция. Сливаются разъемы CF
МС7004 и 7004А на AT и XT
Пайка термотрубок
Проммать s478 PEAK 715VL2-HT ( Full-Size SBC)
Подскажите по 386 материке по джамперам.

Самые активные 5 тем RSS