1 Отредактировано Voldemar0 (22-07-2024 22:04)

Тема: Надёжность флопиков и RAW NAND

Привет!

Лет 30 назад многие, работавшие с Агатом, думали или мечтали о подключении к Агату жесткого диска.
Я тоже думал об этом. Цель была не столь в объёмах, сколь в надёжности хранения.
На PC уже появились винты по 100 мег и выше и отказывали оно уже довольно редко.

Но позднее, когда я стал узнавать о кодах восстановления данных и прочих интересных штуках,
то стал задумываться о том, можно ли было бы сделать флопики более надёжными, пусть даже ценой некоторой потери объёма ?

Например, на дорожках 840ки обычно есть 21 сектор, но нередко попадаются защищенные диски с 22 секторами на каких нибудь дорожках. Поздние драйвера, поддерживающие ленивое чтение, имеют буфер для полной дорожки. Если этот буфер чуть расширить и форматировать 22 сектора на каждую дорожку, то можно в лишний сектор запихнуть XOR'ку от остальных байт на остальных секторах.
Имея такой сектор, можно будет, при ошибке чтения одного любого сектора (но только одного!), восстановить этот сектор из оставшихся 21.

Да, это будет требовать времени при записи (расчёт 22-го сектора при любом обновлении трека), но это не очень большое время.

--

Но недавно мне подумалось ещё вот о чём: а как бы сделать возможность высокой надёжности загрузки операционки с флопика ?
Ведь первой работает прога в ПЗУ, там и так места мало, да можно ли обойтись там без модификаций ?

--

История развивается по спирали. Флопики были не надёжны, жесткие диски стали получше, EEPROM стали ещё получше, потом Flash-память, достигшая рессурса едва ли не в миллион перезаписей. Но потом, в погоне за объёмами, история вернулась к ненадёжными накопителям: современная многоуровневая флеш имеет рессурс всего около 3000 перезаписей. Вроде бы много - если сравнить с флопиком, но мало, если много прог пишут что-то одновременно, часто и, при этом, постоянно перезаписываются системные области.
Тогда возникла идея о FTL (не, она раньше возникла, просто о ней меньше говорили).  Flash Translation Layer - слой управления флеш-памятью, который пытается обеспечить равномерный износ ячеек памяти. Может быть организован как часть накопителя (свой контроллер внутри USB-флешки, SD-карты и т.д.) либо являться частью операционной системы (в этом случае используется т.н. RAW NAND - флеш-памяти без своего FTL).

Как работает FTL если совсем по простому: операционке нужно сохранить сектор номер 2. Она отправляет его на накопитель, там логика FTL решает: пишем в блок 12354, он сейчас свободен и отметит в своих таблицах, что сектор 2 сейчас сохранён в блоке 12354. А также увеличит счётчик износа этого блока. Если операционка снова запросит запись в сектор 2, FTL запишет данные уже в блок 12355 и отметит, что теперь сектор 2 сохранён в блоке 12355.

И вот именно этот вариант - когда используется FTL в операционке и RAW NAND в качестве накопителя - я как раз вспомнил в связи с Агатом. В чём интересное: как загрузить операционку с RAW NAND, если без операционки невозможно понять, где у тебя какой блок данных ? Т.е., например: операционка имеет начальный загрузчик в секторе 0, но в каком блоке RAW NAND находится этот сектор ?

Как это решается, например, в процессоре FreeScale imx6: ROM loader сперва читает блок RAW NAND номером 16 (точную цифру не помню, её можно уточнить в доках на проц). После этого он проверяет, что контрольная сумма блока верна и что блок имеет определённую сигнатуру. Если блок не прочитался (а реальная RAW NAND вполне может иметь несколько нечитающихся блоков даже при выходе с производства), ROM loader читает следующий блок и повторяет для него все те же операции.
Первый же блок, который будет иметь правильную CRC и сигнатуры, будет считаться загрузчиком.

В теле этого загрузчика уже будет находится что-то вроде "таблицы разделов" - это список регионов блоков RAW NAND, который будет передан ядру ОС. В соответствии с этой таблицей ядро уже будет настраивать свою подсистему FTL. Естесно, блоки, где хранится начальный загрузчик, не включаются в эту таблицу.

Как записывается начальный загрузчик ? Утилита записи, зная о ненадёжности RAW NAND, после записи каждого блока проверяет его чтением. Если блок не почитался (CRC не совпала), она повторяет запись той же информации в следующий блок.
Точно также пишется и ядро операционки, а также DTB-файл (описатель оборудования).
Всё остальное хранится уже поверх FTL, как правило, с использованием файловой системы UBIFS.

--

Возвращаясь к Агату:
ROM loader Агата работает похоже: он читает сектор 0/0, проверяет его CRC, если есть ошибка, он снова пытается найти и прочитать сектор 0/0. Поэтому, если создать примерно такой трек:
0 1 2 3 4 5 6 0 7 8 9 10 11 12 0 13 14 15 16 17 18 19
мы получим трек с трехкратным повтором сектора 0.
Так как ROM loader ищет подходящий сектор постоянно, он переберёт все сектора и те, которые будут иметь номер 0, попробует прочитать. Наверняка хотя бы одна из копий прочитается.

Можно также продублировать остальные сектора.

Интересно, что мне не встречалось в коллекциях агатовскго софта каких либо попыток повысить надёжность хранения данных на дисках программным путём, хотя, IMHO, это было вполне возможно. (Причем, например, для волковского архиватора 140кб дисков на 840ку - ввести какой-то подобный алгоритм было бы и не сложно и весьма полезно.)

Хотя эта тема на магнитофонах Спектрумов, вроде бы (поправьте, если я ошибаюсь!), вполне развивалась.

2

Re: Надёжность флопиков и RAW NAND

С одной стороны надежное хранение данных на флопах - это прикольная тема. С другой стороны, наличие данных для восстановления решает только часть проблем.

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

Другая проблема - выдергивание дискеты пользователем в процессе работы. Например, программа отдала все данные ДОСу и завершилась. Пользователь дергает дискету, а драйвер с отложенной записью в это время еще что-то дописывает.
И может ведь получиться так, что именно этот дополнительный 22 сектор не запишется, поэтому при попытке восcтановления получится непонятно что.

Еще проблема - если программа не пользуется файлами, а пишет данные через RWTS. В случае сбоя она может так файловую систему разнести, что никакие резервные сектора не спасут.

Отдельная проблема - это сами контрольные суммы. XOR всех байтов - это очень слабенький алгоритм. У него кстати, свое название есть - продольная четность (longitudinal redundancy check). Этот алгоритм появился в 1950-е годы, когда основным носителем были магнитные ленты. На ленту запись делалась многодорожечным блоком головок, который писал сразу 6-битный байт и бит четности. На ленте получалось 7 дорожек. И хотя четность была предусмотрена для каждого байта, оказалось, что этого мало. Поэтому в конце блока данных стали дописывать еще один байт, каждый бит которого являлся битом четности, но посчитанным не сверху вниз, а вдоль блока. Вот этот байт фактически и пишется в конце каждого сектора.

Так вот, недостаток этого алгоритма в том, что если ошибок нечетное число, то он их видит. А если четное - то не видит. Поэтому есть довольно большой шанс прочитать с диска сектор, контрольная сумма которого будет правильной, а данные - неправильными. А если нельзя понять, что в данных ошибка, то и 22-й сектор не поможет.


Voldemar0 пишет:

Поэтому, если создать примерно такой трек:
0 1 2 3 4 5 6 0 7 8 9 10 11 12 0 13 14 15 16 17 18 19
мы получим трек с трехкратным повтором сектора 0.
Так как ROM loader ищет подходящий сектор постоянно, он переберёт все сектора и те, которые будут иметь номер 0, попробует прочитать. Наверняка хотя бы одна из копий прочитается.

Супер! Идея мне нравится.

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

***

Вспоминаю, как в школе делалась надежная загрузка операционки :) Если Агат не грузился с одной дискеты, вставлялась другая. И так пока всю коробку с загрузочными дисками не переберешь :)

3 Отредактировано Voldemar0 (24-07-2024 07:09)

Re: Надёжность флопиков и RAW NAND

> И может ведь получиться так, что именно этот дополнительный 22 сектор не запишется, поэтому при попытке восcтановления получится непонятно что.

Это уже отказ двух секторов: 22 и какого-то ещё. А я сразу оговариваю, что допустим отказ только одного сектора.


> Так вот, недостаток этого алгоритма в том, что если ошибок нечетное число, то он их видит.

Я не предлагаю отказываться от уже имеющегося контроля CRC. Сектор 22 и XOR'ка по всем секторам нужны только для восстановления, в случае разрушения одного из секторов. Т.е. при записи пересчитывается и перезаписывается 22-й сектор, а при чтении, если стандартная CRC по всем запрошенным секторам совпала без ошибок, то 22-й сектор можно и не читать.

> Но не совсем понято, что дальше с этим делать.

Я тут решаю две, мало связанных друг с другом задачи. 22-й сектор - это защита по всем трекам. А многократный повтор нулевого сектора - это защита именно нулевого трека с учётом того, что ROM loader не умеет восстанавливать данные по схеме с 22 секторами и ему нужна понятная для него структура данных.

Т.е. одним способом защищается нулевой трек и другим - остальные.


> И так пока всю коробку с загрузочными дисками не переберешь :)

Тут должен быть хоть один диск, читающийся полностью.
В моём же случае каждый сектор вытаскивается самостоятельно, т.е. загрузится можно даже если все имеющиеся диски частично повреждены.

> Еще проблема - если программа не пользуется файлами, а пишет данные через RWTS. В случае сбоя она может так файловую систему разнести, что никакие резервные сектора не спасут.

Таких прог не много. Обычно либо проги загружались сами и имели на борту какую-то ОС (этот случай явно за рамками), либо грузились из Бейсика и тогда, если даже использовали сами RWTS, писали куда нибудь 1 сектор (таблицу рекородов, как правило). Так как задача расчёта 22 сектора - это задача драйвера, то при обращении к штатному драйверу будет не важно, кто инициирует запись. Проблема возникнет только если прога таскает с собой свой RWTS.

Из того, что вспоминается, стоящее особняком: только LODE RUNNER имел большой прямо адресуемый кусок диска с уровнями. И ещё PUSHER читал свой PUSHER.LEVELS через собственный драйвер файловой системы.

--

Ещё интересный вопрос: а если снижать битрейт контроллера, насколько это будет повышать надёжность ?
По PC-шному опыту: иногда, хорошие дискеты на 800 Кб имели меньшую вероятность ошибок, чем на 1.2 Мб (на том же дисководе). Но не всегда. Только с одной маркой дискет (красные Sigma) удавалось на 800 Кб не иметь вообще ни одного сбоя на коробку дисков. Остальные (ИЗОТ и прочее) даже на низкой плотности давали 1-2 сектора со сбоями на диск. Но и высокоплотные TDK, например, давали те же 1-2 сбойных сектора на диск.

Получается, что TDK были выгоднее - общий объём больше, потери - те же.

Это выглядело так, как будто сбой - это локальное повреждение поверхности размером в несколько бит как минимум.
А не проблема общего качества магнитного слоя.

Бороться с отдельными сбоями нескольких секторов на PC было довольно легко: я использовал прогу-тестилку, которая ловила такие сектора и блокировала их. Её отличие от всяких NDD и прочего было в том, что она ловила сектора по отдельному сбою, без попыток их перечтения. Поэтому поиск шел бодро и давал надёжный результат.

--

Подобная же тестилка на Агате тоже хорошо помогала.
Интересно что сейчас (когда искал исходники "Президента") пробовал читать свои старые диски с отмеченными сбойными секторами. И Мост3 вычитывал их без особых проблем, включая сектора, отмеченные как "сбойные".

--

Интересно, а если отключить голову дисковода от штатного усилителя-формирователя и зацепить её на какой нибудь усилок + однобитный АЦП (просто компаратор, который возвращает 1 при положительной полуволне и 0 при отрицательной), не позволит ли это ещё приподнять качество чтения ? Или может быть использовать двух или трех битный АЦП .... Есть ли тут какие-то дополнительные возможности ?

4 Отредактировано AlexBel (24-07-2024 19:34)

Re: Надёжность флопиков и RAW NAND

Voldemar0 пишет:

Хотя эта тема на магнитофонах Спектрумов, вроде бы (поправьте, если я ошибаюсь!), вполне развивалась.

У "Вектор-06Ц" загрузка с магнитофона идёт блоками по 256 байт. Каждый блок имеет свою КС. Если при прочтении блока КС не совпадает с расчётной - ошибка. Но есть возможность дублировать каждый блок. Т.е. если при прочтении блока возникла ошибка, то есть шанс правильно прочитать его копию. Скорость загрузки, конечно, падает вдвое, но повышается надёжность. Пишу по памяти, но истина где-то рядом :)


Все эти идеи по повышению надёжности работы дисководов - это какие-то планы для дальнейшего внедрения или просто размышления?

5 Отредактировано Voldemar0 (25-07-2024 06:41)

Re: Надёжность флопиков и RAW NAND

> Все эти идеи по повышению надёжности работы дисководов - это какие-то планы для дальнейшего внедрения или просто размышления?

Больше теория. Поэтому и раздел выбран "Прочее...", а не специализированный по дисководам.
Её можно было бы попробовать внедрить, но есть ещё много другого интересного, что тоже хотелось бы сделать.

6

Re: Надёжность флопиков и RAW NAND

Voldemar0 пишет:

Это уже отказ двух секторов: 22 и какого-то ещё. А я сразу оговариваю, что допустим отказ только одного сектора.

А какая-нибудь статистика есть? Сколько обычно бывает сбойных секторов на один трек на Агатовских дисках?

Voldemar0 пишет:

Ещё интересный вопрос: а если снижать битрейт контроллера, насколько это будет повышать надёжность ?

Тут сразу непонятка, ведь Агатовский контроллер битрейт снижать не позволяет? Или мы чисто теорию обсуждаем?

Если чисто теорию, то у DD-шных (800 Кб) и HD-шных (1.2 Мб) дискет разный материал магнитного слоя. Это как железные и хромовые кассеты. Поэтому, если отформатировать DD-шный диск в 1.2 Мб дисководе, то ошибки будут 100%. Потому что коэрцитивная сила у магнитного слоя разная. Из-за этого ток записи ему нужен другой.
1.2 Мб дисковод на DD-шный диск будет писать с перегрузкой, в результате чего не будет правильно работать предкомпенсация записи. А при чтении полезут ошибки.

Если наоборот, HD-шный диск записывать на 800 Кб дисководе, то ему ток записи будет мал и при чтении вырастет уровень шумов. То есть, ошибок тоже будет больше.

Но зато есть некоторый шанс повысить надежность на DD дисках в 800 Кб дисководах. Например, можно отказаться от MFM формата и использовать обычный FM. Плотность записи упадет в 2 раза, за счет этого каждый бит будет занимать большую площадь на диске и его тяжелее будет убить при потере куска магнитного слоя.

Voldemar0 пишет:

Интересно, а если отключить голову дисковода от штатного усилителя-формирователя и зацепить её на какой нибудь усилок + однобитный АЦП (просто компаратор, который возвращает 1 при положительной полуволне и 0 при отрицательной), не позволит ли это ещё приподнять качество чтения ? Или может быть использовать двух или трех битный АЦП .... Есть ли тут какие-то дополнительные возможности ?

Это вряд ли. Канал чтения дисковода состоит из усилителя с фильтром, дифференциатора и компаратора. То есть, усилитель и компаратор там уже есть. А дифференциатор - это важная штука, которая выдает производную входного сигнала. То есть, если сигнал на входе растет, то на выходе дифференциатора положительное напряжение. Если входной сигнал падает - то отрицательное.

Дифференциатор нужен по двум причинам. Во-первых, магнитная головка, по сути, интегрирует магнитный поток. На диске намагниченность меняется резко, а на выходе головки напряжение меняется плавно. И нужно, грубо говоря, вернуть резкость этим переходам. А во-вторых, важная фишка в том, что величина сигнала не важна. Хоть сигнал со 100 до 200 милливольт поменялся, хоть с 10 до 20, дифференциатор это заметит. То есть, он работает как быстродействующая АРУ.

А вот однобитный АЦП малые уровни сигнала будет просто игнорировать, так что на кусках диска с поврежденным магнитным слоем он ничего не будет видеть.

Если уж переделывать штатный канал чтения, то ставить надо хороший АЦП с большой разрядностью и переносить всю аналоговую обработку на процессор. Но это требует нехилых скилов в цифровой обработке сигналов.

7 Отредактировано Voldemar0 (26-07-2024 07:30)

Re: Надёжность флопиков и RAW NAND

> А какая-нибудь статистика есть? Сколько обычно бывает сбойных секторов на один трек на Агатовских дисках?

У меня почти нет статистики по обычному использованию 840ок, но то, что я видел с мостами: одиночные ошибки легко возможны, но и множественные тоже. Но когда начинают сыпаться множественные, то это нередко будет по значительной части диска. Например, по 2-3 сектора на каждой дорожке. (Причем даже номера секторов будут иметь какую-то регулярность, как будто царапина по поверхности. Если я вижу такой образ, то обычно спрашиваю у Игоря, нет ли явных механических повреждений на диске ? Иногда бывает, но иногда в явном виде их нет.)
Или множественные на конкретном дисководе. Ставим диск на другой - там проблем резко меньше.

На 140ках ошибки были трёх типов:
- 1-2 сбойных сектора на случайном треке.
- массовые (больше половины секторов) на последних треках (примерно от 30-го с плавным нарастанием): 29 - 2, 30 - 4-6, 31 - 5-8; 32 - 10; 33 - 13; 34 - 15. Это стало проявляться по мере износа головы.
- странный баг на 17-й дорожке: часто бывает повреждён сектор 7. Скорее всего, это какая-то программная ошибка, но может быть и нестабильность скорости привода (этот сектор затирается при перезаписи VTOC - нулевого сектора).

{
  К слову, на PC обычно бывало 1-2 ошибки на трек, но на редких треках. Исключение: нулевая дорога, два сбойных сектора вполне было нормой. Видимо из-за того, что там головка проводит значительную часть времени, читая и переписывая FAT.
}

Т.е. в идеале надо быть готовым к 2 ошибкам на треке. Это хорошо будет закрывать случаи исправной и юстированной аппаратуры. При этом можно расчитывать, что много соседних треков вообще не будут иметь ошибок. Поэтому, если бы хватало вычислительных мощностей и ОЗУ, можно было бы объединять 2-4 несоседних трека в группы для синтеза избыточных данных. Но это уже заметно завалит скорость работы: для расчёта каждой группы придётся либо иметь копию всех треков группы в ОЗУ или перечитывать нужные треки. Тут уже пахнет каким-то дисковым кешем, хотя бы небольшого размера и связанным с этим требованием иметь сигнал Disk Change.


> Тут сразу непонятка, ведь Агатовский контроллер битрейт снижать не позволяет? Или мы чисто теорию обсуждаем?

Теория. Но источник тактовой частоты только один, так что воткнуть по ходу движения делитель выглядит не очень сложной задачей. Либо пристроить какой-то внешний, может быть регулируемый, генератор.
Это более сложно для 140ки, из-за её синхронизма с ЦП и заметно попроще на 840ке.

> дискет разный материал магнитного слоя

Это я знаю. И везде, где описываю разные ёмкости, речь идёт именно о дисках, соответствующих битрейту и режимам записи. Если про PC.

Про Агат, причем с дисками 3.5'':

> Если наоборот, HD-шный диск записывать на 800 Кб дисководе, то ему ток записи будет мал и при чтении вырастет уровень шумов. То есть, ошибок тоже будет больше.

Тут вот какое наблюдение: дисков 3.5'' на DD у меня почти нет. Но есть много HD. Они неплохо работают на низком битрейте с агатовским контроллером если заклеить окошко плотности. Я бы сказал так, что именно с Агатом в таком режиме эти диски работают даже лучше, чем с PC. Ошибки бывают, но довольно стабильные по размещению, похожие на износ поверхности. Диски совсем не новые.

И как тут объяснить несоответствие плотности записи материалу поверхности - не знаю.

Вообще, сама теория вроде бы понятна, но ведь спектры HD и DD записи значительно перекрываются: 1-2-3 мкс и 2-4-8 мкс. Возможно, шумы тут меняются не очень существенно. Да и, как помнится, DD-диск 5.25'' можно было отформатировать в HD, хотя, наверное, уровень ошибок возрастал. Но у меня статистики тут нет.

8

Re: Надёжность флопиков и RAW NAND

Voldemar0 пишет:

И как тут объяснить несоответствие плотности записи материалу поверхности - не знаю.

Пониженный ток записи ведет к снижению уровня сигнала при чтении (и снижению отношения сигнал/шум). Но канал чтения изначально рассчитан на большие колебания уровня. Я тут на странице про дисководы 140 Кб нашел измерительную карту http://agatcomp.ru/agat/Hardware/DZU/Dr … 088KIK.jpg, и там показаны уровни сигнала на 0 и 34 дорожках (пункты 5 и 6). На конкретном дисководе это 360 и 180 мВ, но допустимые значения там от 100 до 1000 мВ.

То есть, хотя пониженный уровень сигнала это плохо, канал чтения до какого-то момента может с ним работать, и качество чтения падает не так сильно. А дальше работает увеличенная площадь каждого бита (битрейт ниже - площадь бита больше) и качество чтения повышается.

Думаю как-то так.

***

Кстати, на странице про дисководы написано, что измерительная карта для ЕС 5088.02. Но при этом в карте есть параметры сигналов ИНДЕКС и ДОРОЖКА 00, хотя ни тот ни другой сигнал ЕС 5088.02 не вырабатывает. Такие сигналы есть только у простого ЕС 5088. Наверное, надо что-то поправить.