Запись на жесткий диск из непрерывной физической памяти
У меня есть устройство на базе ARM под управлением Linux, которое подключено к камере, и я пытаюсь эффективно сохранять захваченные кадры в HD.
- Я занимаюсь разработкой в пространстве пользователя, но могу изменять драйверы по желанию
- Я кодирую в C
- Кадры, которые записываются в память с использованием DMA, и у меня есть указатель их физической памяти.
- Я могу контролировать весь процесс захвата кадров и могу сказать, когда буферы кадров стабильны (вычеркнуты из драйвера video4linux)
- Версия для Linux 3.0.35
- Я знаком с исходным кодом ядра, не эксперт, но я могу найти свой путь в этом и выяснить вещи, если я получу некоторые подсказки...
Я считаю, что у меня есть 2 варианта:
Найдите оптимальную конфигурацию для моей файловой системы, для открытия файла и записи в него. Сейчас я использую ext4 и стандартные функции fopen() fwrite(). Я понимаю, что могу также использовать mmap или добавить флаг O_DIRECT при вызове open(), но пока не пробовал.
Найдите способ передать физический адрес буфера (я могу получить его из моего драйвера Video4Linux) непосредственно в файловую систему / драйвер жесткого диска, чтобы данные были переданы непосредственно оттуда.
Я обнаружил, что метод 1 медленный, и в качестве узкого места используются транзакции с памятью, поскольку fwrite предполагает копирование данных из пространства пользователя в пространство ядра, а затем снова в какой-то кэш, а затем в DMA. Слишком много транзакций памяти для простого магазина...
Что касается метода 2 - я не знаю, возможно ли это, но если бы я был тем, кто разрабатывал эту систему с нуля, я бы так и сделал.
Какие-нибудь мысли?
- Что касается метода 1 (с использованием open () и write(), mmap() и / или O_DIRECT), можете ли вы порекомендовать оптимальные настройки для моей цели?
- Возможен ли метод 2 (сохранение в HD напрямую из существующего буфера DMA)? Если так - можете ли вы указать мне пример?
1 ответ
Единственная проблема с записью в файл с помощью mmap в UNIX - это то, что вы должны иметь дело с сигналами в случае нехватки дискового пространства, или вы должны убедиться, что файл не разрежен, и, таким образом, все необходимое дисковое пространство уже выделено. Я думаю, что современная версия G++ предоставляет метод преобразования сигналов в обработку исключений C++, но я не уверен, насколько это поддерживается в других системах, кроме mac-os.