Я работаю над встроенным приложением видеомагнитофона Linux, которое записывает видео в формате MP4 в файл (на SD-карту формата FAT).
Некоторые усложняющие факторы - это то, что видео и аудио данные поступают из аппаратных кодеков.которые должны обслуживаться с низкой задержкой и должны записывать в буферы с поддержкой DMA.
В данный момент для выходного файла я использую open () и write (), но обнаружим, что write () может занять сотнимиллисекунд, чтобы вернуться, когда система находится под нагрузкой, поэтому мои записи выполняются в отдельном потоке.
В существующем состоянии я копирую данные из (небольшого, ограниченного числа) буферов DMA в мультимегабайтный malloc 'd кольцевой буфер, затем write () из этого в другом потоке.Это означает, что я делаю как минимум две копии, один раз в буфер приложения и один раз в кэш системного буфера.
Я рассматриваю попытку записи O_DIRECT, чтобы избежать копирования, но мне интересны любые комментарии.Я отмечаю, что Роберт Лав комментирует, что O_DIRECT ужасен , но не говорит почему.
С другой стороны, мне также было бы интересно, если кто-нибудь знает способ заставить write () неостанавливаться на длительные периоды времени (AIO?), тогда я мог бы использовать буферный кеш, как предполагал Линус.
Этот вопрос не связан с моим очень старым вопросом о записи срывов .