Какова взаимосвязь между параметрами jffs2, характеристиками флэш-устройства, настройкой драйвера и диспетчером памяти ядра?

Я работаю над обновлением прошивки на устаревшей плате с модифицированной версией 2.6.12.1 с процессором at91rm9200 и at45db642D для использования at45db641E флэш-память. Характеристики 641E:

  • 32768 страниц
  • размер страницы 264 байта
  • гибкие параметры стирания для стирания страницы (264 байта), блока (2 КБ), сектора (256 КБ) или всего чипа (64 Мбит).

Я полагаю, что размер страницы диспетчера памяти ядра составляет стандартные 4096 байт.

Я хочу поместить на устройство соответствующий образ jffs2. Варианты mkfs.jffs2 я интересно о (со страницы руководства):

  • --pagesize: использовать размер страницы SIZE. По умолчанию 4 КиБ. Этот размер является максимальным размером узла данных. Установите в соответствии с размером страницы управления памятью целевой системы (ПРИМЕЧАНИЕ: это НЕ связано с размером страницы NAND).
  • --eraseblock: использовать размер блока стирания SIZE. По умолчанию 64 КиБ. Если вы используете размер блока стирания, отличный от размера блока стирания целевого устройства MTD, JFFS2 может работать неоптимально. Если указанный SIZE меньше 4096, предполагается, что единицы измерения составляют КиБ.

Человек говорит, что размер страницы связан с размером страницы управления памятью ядра (в моем случае 4096, то же, что и по умолчанию), а НЕ со страницей устройства размером 264 байта. Поэтому мне нужно указать --pagesize=4096, а НЕ --pagesize=264, правильно ли это?

Мужчина также говорит, что --eraseblock должен быть того же размера, что и блок стирания устройства MTD. Я смущен несколькими вещами.

  1. 641E имеет несколько различных вариантов стирания. Что нужно выбрать для параметра mkfs.jffs2 --eraseblock?
  2. Если правильным вариантом является либо размер страницы 641E, либо размер блока, как я могу указать это в mkfs.jffs2, учитывая тот факт, что значения ниже 4096 предполагаются в КБ, а не в байтах?
  3. Этот ссылка (на которую ссылается этот связанный, но недостаточный SO question) говорит, что узлы jffs2 должны полностью помещаться в блоке стирания. Поскольку их размер составляет 4+ КБ, что больше, чем размер «блока стирания» устройства, ссылка говорит: «Вы должны объединить несколько блоков стирания в один виртуальный блок стирания размером 64 или 128 КБ и использовать его - это будет более оптимально», а затем «Вам нужно, чтобы ваш драйвер сообщал о размере блока стирания 128 КБ и эмулировал его, тогда он будет работать. Он не будет работать из коробки». Как настроить такой «виртуальный блок стирания»?
  4. В драйвере at91 dataflash device->erasesize=pagesize. Таким образом, похоже, что есть несколько похожих, но разных концепций: размер стираемого драйвера, размер стираемого блока устройства и размер стираемого блока jffs2. Каковы отношения и различия между ними? Как размер блока стирания, указанный в jffs2, в конечном итоге влияет на операции, выполняемые драйверами?

Спасибо за любую помощь.


person fluffynukeit    schedule 23.04.2016    source источник


Ответы (1)


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

Есть четыре термина с одинаковыми названиями, связанными, но не обязательно равными. От высшего уровня к низшему...

  1. mkfs.jffs2 eraseblock — определяет расположение узлов в результирующем двоичном образе файловой системы.
  2. установленный виртуальный размер блока jffs2 — определяет, как размещаются узлы при чтении и записи в файловой системе jffs2.
  3. mtd core erasesize — это наименьшая стираемая единица, которая сообщается коду файловой системы jffs2 реализацией драйвера флэш-памяти данных.
  4. удаление страницы/блока/сектора устройства – это параметры кодов операций аппаратного стирания, доступные разработчику драйвера устройства для стирания данных из флэш-памяти.

Вот ограничения, как я их понимаю.

  • Какой-то параметр в #4 должен быть меньше или равен #3. В файле at91_dataflash.c они равны, и оба равны размеру страницы 264 байта (т. е. размер стирания ядра mtd = размер страницы флэш-памяти = 264 байта). Как правило, некоторая комбинация кодов операций, доступных в # 4, должна в сумме точно соответствовать размеру стирания, и драйвер должен выполнить соответствующие коды операций для стирания данных размера стирания.
  • Номинально размер виртуального блока jffs2 в #2 равен размеру стирания ядра mtd в #3. Однако есть случай, когда код jffs2 автоматически изменит размер виртуального блока. Код jffs2 отслеживает грязные и чистые области на флэш-диске, используя набор связанных списков, которые требуют наличия одного узла списка для каждого виртуального блока. Существует ограничение в 128 КБ на общий размер всех таких узлов списка. Если размер виртуального блока очень мал, как в случаях с AT45DB642D и AT45DB641E, где размер виртуального блока = размер стирания ядра mtd = размер страницы флэш-устройства, то это создаст большое количество узлов и превысит ограничение в 128 КБ для узлов. . В этом случае код jffs2 fs автоматически увеличит размер виртуального блока и уменьшит количество виртуальных блоков в 2 раза, пока не будет соблюдено ограничение в 128 КБ. Ядро выдаст сообщение о том, что «jffs2: размер блока стирания слишком мал (0 КБ). Вместо этого используется размер виртуального блока (4 КБ)». (Обратите внимание на точное усечение). Назовем это скорректированным размером виртуального блока.
  • Скорректированный размер виртуального блока используется для монтирования файла jffs2, хранящегося на флэш-памяти. Скорректированный размер виртуального блока должен быть равен размеру стираемого блока изображения jffs2 #1 (хотя это учебник предполагает, что блок стирания #1 должен быть не больше скорректированного размера виртуального блока #2. не проверял.)

Так что в моем случае размер виртуального блока был скорректирован ядром с 264 байт до 4224 байт. Таким образом, моя файловая система jffs2 работала с использованием опции -e 4224 для mkfs.jffs2. Драйвер стирает каждый виртуальный блок длиной 4224 байта по одной странице за раз.

Другие соображения:

  • Параметр -s pagesize связан с размером страницы ядра в соответствии с справочной страницей. Я использовал размер страницы ядра, используя -s 4096.
  • Очень вероятно, что скорректированный размер виртуального блока никогда не будет меньше размера, необходимого для полного узла jffs2, поэтому использование параметра -e меньше 4096 байт маловероятно, что делает мою проблему с единицами спорной.
  • Я ожидаю, что все приведенные выше числа байтов для # 1 и # 2 должны быть чистыми кратными размеру стираемого блока ядра mtd.
  • Автоматическую настройку размера виртуального блока можно отключить/включить в конфигурации ядра.
person fluffynukeit    schedule 26.04.2016