Запись на жесткий диск из непрерывной физической памяти

У меня есть устройство на базе ARM под управлением Linux, которое подключено к камере, и я пытаюсь эффективно сохранять захваченные кадры в HD.

  • Я занимаюсь разработкой в ​​пространстве пользователя, но могу изменять драйверы по желанию
  • Я кодирую в C
  • Кадры, которые записываются в память с использованием DMA, и у меня есть указатель их физической памяти.
  • Я могу контролировать весь процесс захвата кадров и могу сказать, когда буферы кадров стабильны (вычеркнуты из драйвера video4linux)
  • Версия для Linux 3.0.35
  • Я знаком с исходным кодом ядра, не эксперт, но я могу найти свой путь в этом и выяснить вещи, если я получу некоторые подсказки...

Я считаю, что у меня есть 2 варианта:

  1. Найдите оптимальную конфигурацию для моей файловой системы, для открытия файла и записи в него. Сейчас я использую ext4 и стандартные функции fopen() fwrite(). Я понимаю, что могу также использовать mmap или добавить флаг O_DIRECT при вызове open(), но пока не пробовал.

  2. Найдите способ передать физический адрес буфера (я могу получить его из моего драйвера Video4Linux) непосредственно в файловую систему / драйвер жесткого диска, чтобы данные были переданы непосредственно оттуда.

Я обнаружил, что метод 1 медленный, и в качестве узкого места используются транзакции с памятью, поскольку fwrite предполагает копирование данных из пространства пользователя в пространство ядра, а затем снова в какой-то кэш, а затем в DMA. Слишком много транзакций памяти для простого магазина...

Что касается метода 2 - я не знаю, возможно ли это, но если бы я был тем, кто разрабатывал эту систему с нуля, я бы так и сделал.

Какие-нибудь мысли?

  • Что касается метода 1 (с использованием open () и write(), mmap() и / или O_DIRECT), можете ли вы порекомендовать оптимальные настройки для моей цели?
  • Возможен ли метод 2 (сохранение в HD напрямую из существующего буфера DMA)? Если так - можете ли вы указать мне пример?

1 ответ

Единственная проблема с записью в файл с помощью mmap в UNIX - это то, что вы должны иметь дело с сигналами в случае нехватки дискового пространства, или вы должны убедиться, что файл не разрежен, и, таким образом, все необходимое дисковое пространство уже выделено. Я думаю, что современная версия G++ предоставляет метод преобразования сигналов в обработку исключений C++, но я не уверен, насколько это поддерживается в других системах, кроме mac-os.

Другие вопросы по тегам