Перенос драйвера PCIe с Linux на FreeBSD

У меня есть довольно большой драйвер PCIe, написанный для Linux, теперь мне нужно портировать его на FreeBSD. Я еще не знаю версию BSD, но думаю, что на данный момент это не имеет значения, так как я хотел бы понять в целом, какие основные элементы должны быть изменены во время усилий по портированию.

Хорошо то, что драйвер разделен на независимый от ОС «библиотечный» уровень (OSI) и зависимый от ОС, поэтому у него уже есть «каркас», позволяющий портировать его на другие ОС, и я надеюсь, что большая часть усилий будет сосредоточены на стороне OSI. Пока я вижу следующие большие куски работы:

  1. код инициализации, то есть специфичный для ОС код, который «подключает» драйвер в систему (аналогично тому, что делает init_module, cleanup_module в Linux)
  2. код, регистрирующий драйвер в базовой подсистеме PCI ядра
  3. регистрационный код символьного драйвера 4) операции DMA

На что еще я должен обратить внимание? Этот драйвер представляет собой устройство, выполняющее аппаратное шифрование, поэтому оно является разгрузочным устройством (входные пакеты от сетевого адаптера обычно поступают в систему, а затем перенаправляются на устройство).

Если есть полезные веб-ссылки на описание разработки/переноса драйверов BSD (по аналогии с LDD), я бы с радостью их принял :)


person Mark    schedule 22.08.2015    source источник
comment
В руководстве есть глава, более специальный раздел, посвященный устройствам PCI, и пример в /usr/share/examples/kld/cdev FreeBSD. Есть также такие книги, как «Проектирование и внедрение операционной системы FreeBSD» и «Драйверы устройств FreeBSD: руководство для бесстрашных».   -  person kdhp    schedule 22.08.2015
comment
@kdhp, спасибо за комментарий. Есть ли существенная разница в написании драйвера для версий FreeBSD 6.x и 9.x/10.x?   -  person Mark    schedule 24.08.2015
comment
Самому новому файлу в /usr/share/examples/kld/cdev/module 9 лет, поэтому основные принципы должны быть такими же. Возможно, стоит отметить, что в дереве исходных текстов FreeBSD есть много разрешительно лицензированных примеров с длинной историей SVN. Кроме того, справочные страницы в разделе 9 являются частью FreeBSD Kernel Developer's Manual, там задокументировано большинство API ядра.   -  person kdhp    schedule 25.08.2015


Ответы (1)


В 2011 году Джефф Роберсон (а позже Мелланокс) добавил несколько прокладок для облегчения переноса драйверов Linux, что позволяет использовать большую часть кода как есть, когда он переносил драйверы Linux InfiniBand на FreeBSD. Итак, предполагая, что я новичок в мире разработки драйверов для Linux, я бы начал с рассмотрения:

https://svnweb.freebsd.org/base/head/sys/ofed/include/linux/

Где вы найдете реализации многих необходимых API-интерфейсов драйверов Linux и их собственных аналогов FreeBSD.

Есть еще один краткий документ Джона-Марка, здесь, полезный для тех, кто уже знаком с записью драйвера.

Если вы предпочитаете начинать с самого начала, я думаю, что Архитектура FreeBSD Справочник будет полезной отправной точкой.

Кроме того, есть книга Кирка МакКьюсика, Роберта Уотсона и Джорджа Невилла-Нила под названием «Проектирование и реализация операционной системы FreeBSD», последней версией на данный момент является 2-е издание, а в главе 8 подробно описаны драйверы устройств.

Большинство драйверов устройств являются просто обертками аппаратных операций, чтобы соответствовать интерфейсам ОС, поэтому хорошо многоуровневый драйвер должен быть относительно легко переносим в наши дни.

Если у вас есть вопросы или вы являетесь поставщиком оборудования, вы также можете присоединиться к различным спискам рассылки FreeBSD (freebsd-drivers@ и т. д.).

person LI Xin    schedule 28.08.2015