Вопрос или проблема
Комилирование моих видеодрайверов выдает следующую ошибку:
xilinx-dma.h:51: return container_of(e->pipe, struct xvip_pipeline, pipe);
Обнаружил, что следующая строка была удалена из структуры media_entity {}, определенной в ./media/media-entity.h
int stream_count; struct media_pipeline *pipe; В версии ядра 6.1.55 (Сборка в архитектуре ARM64)
Видеодрайвер компилируется нормально под версией ядра 5.15.0-131. (Сборка в архитектуре x86_64)
Интересно, почему была удалена *pipe и как это исправить?
Спасибо, Тайгер
Это политика ядра, документирована здесь.
Если кратко: возможно, вы знаете, что ядро очень осторожно относится к тому, чтобы никогда не ломать API пользовательского пространства. По сути, с точки зрения ядра, вы можете запустить приложение, созданное в 1995 году, и оно будет нормально работать на сегодняшнем ядре.
Ну, с внутренностями ядра дело обстоит иначе. На данный момент ядру примерно 34 года, и причина, по которой оно все еще развивается и не затоплено множеством устаревших элементов, заключается в том, что его внутренности постоянно рефакторятся. Чтобы обеспечить такую долговечность, ядро установило правило, что любой, кто хочет написать драйвер, должен внести его в ядро, чтобы разработчики ядра могли убедиться, что он всегда работает. Технически можно написать драйвер и не вносить его, но тогда вы останетесь без поддержки.
С учетом сказанного…
Видеодрайвер компилируется нормально под версией ядра 5.15.0-131.
…вы явно компилируете сторонний драйвер, который не был внесен в ядро. Как объяснено выше, обеспечение его работы требует от того, кто поддерживает драйвер, обновления интерфейсов для каждой основной версии ядра. Полагаю, авторы драйвера просто поленились отправить его в ядро, а позже они вовсе прекратили его поддержку (потому что 6.1, на который вы компилируете, на данный момент уже 3 года — имею в виду не минорную версию, а основную), так что вам придется обновить драйвер самостоятельно, если вы хотите, чтобы он компилировался для более новых версий ядра.
P.S.: если вы собираетесь обновить драйвер, чтобы избежать лишних исследований, вы можете скачать проприетарный Linux-драйвер NVidia и изучить их код DKMS. Я почти уверен, что все #ifdef
, которые вам нужно добавить в ваш драйвер, будут там, поэтому вы сможете просто воспроизвести, что они сделали.
Но отправка драйвера в ядро, конечно, будет лучшим решением 😊
Ответ или решение
Понимание изменений в структуре ядра Linux может быть достаточно сложной задачей даже для опытных специалистов в области ИТ. При попытке скомпилировать драйверы видео на ARM64 архитектуре под ядро версии 6.1.55 у вас возникла ошибка, связанная с недостающим полем *pipe
в структуре media_entity
. Это проблема, с которой могут столкнуться многие, особенно учитывая быстрое развитие ядра Linux.
Теория
В ядре Linux поддержание обратной совместимости с пользовательскими приложениями является приоритетом — то есть приложения, написанные много лет назад, должны продолжать корректно функционировать на новых версиях ядра. Однако внутренняя структура ядра может претерпевать значительные изменения. Эти изменения направлены на улучшение производительности, безопасности и поддержания актуальности кода. Это включает в себя такие радикальные шаги, как удаление или изменение структур данных, например, удаление поля *pipe
из структуры media_entity
.
Удаление *pipe
может быть частью более крупного процесса реорганизации и упрощения работы с медиа-пайплайнами. Подобные изменения направлены на улучшение архитектуры и упрощение кода, а также подготавливают систему к будущим улучшениям и нововведениям. Это может быть связано, к примеру, с изменениями в способах управления и маршрутизации потоков данных в видеодрайверах, улучшенной поддержкой новых стандартов видеоданных или оптимизацией уже существующих процессов обработки мультимедийного контента.
Пример
Ваша ситуация схожа с тем, что часто случается в мире программирования: функционирующий код перестает работать из-за изменений в интерфейсах или библиотеках. Например, удаление функции или изменения в параметрах интерфейса могут вызвать ошибки компиляции. Это случилось и с вашим драйвером: в то время как на версии ядра 5.15.0-131 он компилировался без проблем, изменения в версии 6.1.55 сделали его несостоятельным. Это доказывает, что драйвер использует старые и устаревшие методы взаимодействия с мультимедийной подсистемой ядра.
Применение
Чтобы решить проблему, вам необходимо привести код драйвера в соответствии с новой версией ядра. Это может включать несколько шагов:
-
Анализ изменений: Проверьте журнал изменений (changelog) версии ядра 6.1.55 для поиска примечаний о причинах удаления
*pipe
. Также можете изучить комментарии в исходном коде и документации ядра, которые могут дать подсказки относительно новой логики обработки медиапайплайнов. -
Обновление кода: Замените использование поля
*pipe
на новые метода и функции, которые предоставляет ядро для работы с медиапайплайнами. Это может потребовать серьезной работы с адаптацией кода и тестирования. -
Использование макросов компиляции: Чтобы повысить совместимость вашего драйвера с различными версиями ядра, используйте макросы
#ifdef
в коде. Это позволит динамически определять версии ядра и применять различные блоки кода в зависимости от используемого API. Обращение к тому, как это делают другие компании, например NVIDIA с их драйверами и системой DKMS, может дать вам полезную информацию и идеи. -
Внесение изменений в сообщество: Если у вас получится успешно адаптировать драйвер, рассмотрите возможность отправки изменений в сообщество Linux. Это не только закрепит вашу работу, но и поможет остальным разработчикам, сталкивающимся с той же проблемой.
Подводя итог, важно понимать, что подобные изменения являются частью эволюции системного программного обеспечения. Постоянное обучение и адаптация к новым условиям в программировании — неотъемлемая часть работы IT-специалиста. Задача обновления драйвера и отправки его в официальное ядро может быть не только практическим решением текущей проблемы, но и шагом на пути к вашему профессиональному росту.