Способ инкрементального сохранения
INCREMENTAL SAVING METHOD

Изобретение относится к компьютерной технике и предназначено для обеспечения корректности работы немеханических запоминающих устройств на основе микросхем памяти (SSD, USB Flash Drive, Flash Card и т.д.).
В настоящее время для сохранения расположения данных секторов в блоках запоминающих устройств используют таблицы трансляции, сохраняемые в адресах страниц.
Недостатком такого метода хранения данных секторов и последующее их восстановление является большой объем сохраняемых данных и длительное время на проведение такой процедуры.
Техническим результатом является уменьшение объема памяти для хранения данных секторов и сокращение времени сохранения таких данных в запоминающем устройстве.
Заявленный результат обеспечивается способом инкрементального сохранения данных секторов в немеханических запоминающих устройствах, в котором у блоков, у которых осталась одна свободная страница, осуществляют сохранение на эту страницу данных о секторах, содержащихся в соответствующем блоке, при этом для каждого блока, кроме зарезервированных для сохранения, отмечают момент, когда он был заполнен. А для восстановления таблицы трансляции предлагается способ инкрементального восстановления таблиц трансляции данных секторов в немеханических запоминающих устройствах, заключающийся в том, что при подаче питания на запоминающее устройство вначале загружаются данные из зарезервированных блоков, после чего считывают последнюю страницу каждого блока и для каждого логического адреса из этой страницы в таблицу трансляции записывается физический адрес страницы, на которую этот сектор записан.
Предлагаемый способ хранения и восстановления данных о секторах позволит уменьшить объем памяти для хранения данных секторов и ускорить время сохранения таких данных в запоминающем устройстве из-за отсутствия лишних операций.
Подробное описание изобретения.
Суть состоит в записи логических адресов всех секторов, записанных в блок, на последнюю страницу блока. Эта процедура вызывается для блока в тот момент, когда в нем остается одна свободная страница. Кроме адресов секторов, на последнюю страницу блока записываются и некоторые другие данные – температура блока и износ блока, что позволяет не тратить время на сохранение этих данных при отключении питания. Для каждого блока (кроме зарезервированных для сохранения) отмечается момент, когда этот блок оказывается заполнен (время его закрытия).
При включении питания сначала загружаются все данные из зарезервированных блоков. Затем происходит чтение последней страницы каждого блока (кроме зарезервированных и свободных), и для каждого логического адреса из этой страницы в таблицу трансляции записывается физический адрес страницы, на которую этот сектор записан (этот адрес легко вычисляется по положению адреса сектора на последней странице). Если логический адрес находится на последней странице нескольких блоков, предпочтение отдается тому блоку, который был заполнен позже остальных
Реализация включает две группы функций – функции, вызываемые при сохранении программного обеспечения (ПО) и функции, вызываемые при загрузке ПО.
Функции, вызываемые при сохранении ПО:
Сохранение инициируется функцией сохранения драйвера нижнего уровня ПО. Эта или аналогичная ей функция будет вызвана после поступления в драйвер аппаратного сигнала о том, что началось выключение накопителя.
У всех классов ПО, требующих сохранения, реализована собственная функция сохранения, переписывающая требующие сохранения данные во внутренний буфер объекта класса потока вывода. Все эти функции вызываются из функции сохранения для одного и того же объекта класса потока вывода.
Объект потока вывода накапливает сохраняемые данные в своем внутреннем буфере. Если буфер заполнен (либо вызвана функция сброса буфера класса потока вывода, что означает, что все предназначенные для сохранения данные уже записаны в буфер), то он переписывается на зарезервированный блок флеш-памяти. Размер буфера равен произведению длины страницы на количество путей на диске, поэтому запись на носитель осуществляется параллельно на все пути.
При записи на носитель в зарезервированный блок в параметрах передается номер страницы зарезервированного блока, куда будет осуществлена запись; указатель на начало переписываемого участка в буфере объекта; и признак, который указывает аппаратуре, является ли данная страница последней страницей, записываемой при сохранении ПО.
Основные данные ПО, сохраняемые в зарезервированные блоки при выключении питания - последние страницы открытых блоков (при 512 страниц в блоке потребуется не более 2 страниц на 1 путь, а при 1024 страниц в блоке - не более 4 на 1 путь, независимо от числа блоков на пути), время закрытия каждого блока (не более чем по 4Б на каждый блок). Кроме того, ядро ТНИ сбрасывает на флеш-память свой кэш (128 страниц).
Таким образом, достигается значительная экономия объема сохраняемых данных и времени сохранения по сравнению с диском, где осуществлялось бы сохранение таблицы трансляции. Например, объем данных, сохраняемых при выключении питания для 1 ТБ-диска – менее 7 МБ, а объем таблицы трансляции для такого диска – более 800 МБ.
Функции, вызываемые при загрузке ПО:
Загрузка инициируется функцией загрузки драйвера нижнего уровня ПО. Эта или аналогичная функция будет вызвана после поступления в драйвер аппаратного сигнала о том, что произошло включение накопителя.
У всех классов ПО, для которых реализовано сохранение данных, реализована так же функция загрузки, загружающая значения полей классов из внутреннего буфера объекта класса потока ввода. Все функции загрузки классов вызываются из функции загрузки драйвера нижнего уровня для одного и того же объекта класса потока ввода.
Если все данные из внутреннего буфера объекта оказываются переписаны в поля классов ПО, а загрузка данных из зарезервированных блоков еще не завершена, происходит чтение новой порции данных из зарезервированных блоков накопителя. Размер буфера равен произведению длины страницы на количество путей на диске, поэтому чтение с кристалла флеш-памяти осуществляется параллельно со всех путей.
Чтение с накопителя осуществляется из зарезервированных блоков, при этом в параметрах передается это номер страницы блока, откуда будет осуществлено чтение; указатель на начало участка в буфере объекта, куда будет записана прочитанная страница.
Когда все данные из зарезервированного блока прочитаны, этот блок стирается, после чего он готов к записи при следующем сохранении ПО.
После того, как чтение из зарезервированных блоков завершено, из функции чтения драйвера низкого уровня вызывается чтение последней страницы каждого блока, кроме зарезервированных блоков и свободных блоков. То, что блок свободен, можно определить по тому, что время его закрытия указано как 0.
Для чтения последних страниц также используется функция чтения из зарезервированного блока драйвера нижнего уровня или аналогичная ей функция, которая читает с накопителя любую заданную страницу. Прочитанная страница преобразуется в объект класса, содержащий структурированное представление данных, записанных на последнюю страницу блока, и передается функции обновления таблицы трансляции. В этой функции происходит восстановление участков таблицы трансляции, соответствующих данному блоку.
После окончания чтения обновления таблиц трансляции, в которой происходит формирование участков таблицы трансляции, соответствующих открытым блокам, а также восстановление тех элементов ПО, которые можно восстановить, зная таблицу трансляции (например, валидность блоков). На этом загрузка завершается.
Для 1 ТБ-диска с 512 страницами в блоке объем данных, читаемых при загрузке, составит 2 ГБ, а для 1 ТБ-диска с 1024 страницами в блоке - 1 ГБ.