Библиотека эмуляции флэш-памяти - захват записи в память - PullRequest
1 голос
/ 24 марта 2012

Мне необходимо написать библиотеку (на C ++), которая будет эмулировать NOR flash как поведение. (Платформа - Windows, язык-C ++) (Извините за очень длинный пост, я пытаюсь объяснить, что я сделал до сих пор :))

Требуемое поведение:

Итак, вот как это должно работать, я должен вернуть диапазон памяти, который пользователь будет использовать в качестве флэш-памяти. Он должен быть в состоянии прочитать любые байты из возвращенного буфера памяти, что не является проблемой, основная проблема заключается в записи, потому что поведение записи мигает иначе, так что вы можете сбросить только бит, если адрес имеет содержимое (в двоичном виде) 10101010, и пользователь пытается записать 01011001 по этому адресу, тогда это местоположение должно фактически содержать 10101010 & 01011001 = 00001000 после записи. Я не уверен, как это сделать!

Вот те подходы, о которых я думаю:

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

Ниже приведены некоторые способы, которыми я думал о ...

Подход 1:

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

Преимущества:

=> Сохраняет реализацию простой.

Недостатки:

=> Снижает удобство использования модуля, накладывая ограничения на пользователя в отношении записи.

Подход 2:

Напишите класс, который будет перегружать все возможные операторы доступа к памяти. Как то так

template <class T> class flashMemory
{
    T data;
public:
    void operator = (T newData) {data &= newData};
    // Overload other operators too...
};

Преимущество: => Опять же, делает реализацию простой.

Неудобство: => Несмотря на то, что мы можем обрабатывать большинство случаев записи, мы не можем обрабатывать их в ситуациях, подобных приведенному ниже фрагменту кода.

flashMemory *flashPtr = flashObj.getPointer();
flashPtr[10] = 'X';                        //Using overloaded operator, This is fine
memcpy(flashPtr, someBuff, someSize);    //This is NOT fine
...
char *myPtr = (void*)flashPtr;    //Everything below using typecasted ptr is NOT fine. 
myPtr[100] = 'X';
memcpy(myPtr, 0, someSize);
memcpy(myPtr, destPtr, dataSize);

Таким образом, это может снова не быть полным решением и может вызвать много проблем с любым новым кодом.

Подход 3:

Третий подход - установить защиту страницы на READ_ONLY и перехватывать любые попытки записи через обработчик сигналов (mprotect и sigaction в Linux), но на данный момент я могу только перехватывать вызовы записи, но пока не могу получить больше информации для завершения запрос на запись. Изучим его, чтобы узнать, можно ли перехватывать вызовы записи и записывать данные после применения маски. Если это возможно, это может быть полное решение.

Преимущества: * * один тысяча пятьдесят-одна

1) Может обрабатывать запросы на запись прозрачно без каких-либо изменений для пользователя с помощью эмулятора.

Это выглядит прекрасно, но я могу только получать прерывания, говоря, что было нарушение доступа, но я не знаю, как на самом деле получить записываемые данные и применить маску перед записью в обработчик прерываний! (Но я попробовал это в Linux, не сделал этого в Windows)

Подход 4:

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

Это всего лишь мысль, я не уверен, что это вообще можно сделать, и даже если это будет сделано, это может быть излишним для моего требования.

Подход 4:

Для прозрачной поддержки чтения и записи, как в подходе 3, мы можем использовать Linux-среду FUSE, эквивалентную среде Linux (на данный момент у меня есть DOKAN http://dokan -dev.net / ru / и CBFS http://www.eldos.com/cbfs/). Используя это, мы можем представить наш код в виде файловой системы системе, и все вызовы чтения и записи будут перенаправлены на наш код в пространстве пользователя, где мы можем манипулировать данными так, как нам хочется. Такнаш код будет состоять из 2 частей:

  1. Библиотека, предоставляющая класс flash_emulator автору приложения (который у нас есть сейчас), => Это откроет файл эмуляции флэш-памяти в пользовательскомПространственная файловая система, которую мы создаем, выполняет сопоставленный с памятью file-io и возвращает сопоставленный адрес пользователю, используя который средство записи приложения может выполнять операции с памятью, которые будут преобразованы в действия файловой системы (чтение и запись).

  2. Простая файловая система пространства пользователя.=> Это реализует базовые необходимые интерфейсы, требуемые от файловой системы пространства пользователя, и внутренне использует файловую систему системы для фактического хранения файла.А реализованные операции чтения и записи обеспечат доступ к данным, хранящимся на диске.Чтение будет считываться по ночам из файла, как у нас сейчас, но операция записи применит маску и запись в файловую систему.

Преимущества: => Может прозрачно поддерживать все операции с памятью и эмулировать похожее на флэш поведение за сценой.

Недостаток: => Требуются внешние каркасы, которые нужно использовать, которые будут намного больше, чем код, который мы пишем.(Мне нужно проверить, являются ли они свободными фреймворками или нет, я пока не уверен, проверим и вернемся, если они не бесплатны)

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

Спасибо,

Микроядро

...