разработка драйвера устройства c ++ в linux - PullRequest
11 голосов
/ 07 декабря 2010

Я хотел бы получить более подробную информацию о написании драйверов графических устройств и драйверов аудиоустройств с использованием c ++ для Linux.Я новичок в разработке драйверов устройств. Пожалуйста, предоставьте мне детали разработки / документации для того же.

Спасибо

-Правин

Ответы [ 5 ]

13 голосов
/ 17 января 2016

Позднее, придя к этой странице, Крис Страттон ответил на сам вопрос, но важно исправить несколько вещей, которые Крис Бекке изложил здесь и которые являются распространенными заблуждениями у людей, не знакомых с C ++:

  • C ++ не создает неявный код или данные, только то, что вы запрашиваете.Даже для среднего программиста C ++ не будет никакого дополнительного кода или данных.Я узнал об этом благодаря знанию ассемблера C ++, но просто прочитал книги Скотта Мейерса, и это достаточно хорошо.
  • Мало того, что исключения являются необязательными в C ++, весь их код может быть исключен в связывании, в основном, для каждого инструмента, существующего там.На самом деле это делается в приложениях RT.

Это сделано для устранения ошибочных представлений, размещенных здесь.Однако добавим еще:

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

2) Сказав это, единственное, что может быть создано в базовом C ++, это виртуальный указатель, ЕСЛИ ВАМ НУЖНО ЭТО И указать "virtual", а затем также программисты на C обычносоздать такой указатель, манипулировать им самостоятельно, добавлять таблицы поиска и получать намного более сложные ошибки из-за этого.Как всегда в C ++, если вы не упомянули «виртуальный», вы даже не получите этот указатель.Наследование и инкапсуляция, конечно, полностью свободны от издержек.

3) C ++ создает такое же количество asm и памяти, что и C, если вы явно не запрашиваете специальные функции, но есть распространенный случай, когдаC ++ более эффективен - при передаче указателей на функции.Если вы используете функторы C ++, вы можете встроить указанную функцию.Это чрезвычайно полезно во встроенных приложениях.

4) Если встроенный RT использует C ++, почему linux нет?Просто из-за мифов, поэтому, пожалуйста, внимательно прочитайте это сообщение и обратитесь к Скотту Мейерсу или, еще лучше, к самому асму.Я нахожусь в RT 20 лет и у меня было такое же неверие в C ++, когда я перешел 14 лет назад, но факты не подтверждают такого недоверия.

TL; DR - очень легко написать как эффективныйи в более общем случае более эффективный код на C ++, исследования, большой промышленный опыт и книги по этому вопросу имеются в большом количестве.

8 голосов
/ 07 декабря 2010

Драйверы устройств ядра Linux написаны на C, а не на C ++.

Доступ к большинству драйверов устройств осуществляется через специальный файл устройства (/ dev / yourdevice0), для которого можно выполнять как операции управления, так и операции чтения и записи.

Клиентские программы пользовательского режима и драйверы пользовательского режима открывают файл устройства и используют его в качестве пути для связи с драйвером режима ядра. Эти драйверы пользовательского режима могут быть написаны на C ++ или любом другом языке.

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

6 голосов
/ 07 декабря 2010

Драйверы для Linux разработаны на языке C. Если вы хотите узнать больше о разработке драйверов для Linux, вам следует прочитать эту бесплатную электронную книгу: http://lwn.net/Kernel/LDD3/
Также доступен архив всех глав PDF: http://lwn.net/images/pdf/LDD3/ldd3_pdf.tar.bz2

6 голосов
/ 07 декабря 2010

Поскольку в ядре нет C ++, вы быстро столкнетесь с проблемами.Я полагаю, что вы могли бы создать среду выполнения C ++ для запуска внутри ядра, но для этого потребуются довольно хорошие навыки.Гораздо больше навыков, чем написание драйвера на языке C.

Кроме того, разработчики ядра Linux мгновенно подавят вас.Я имею в виду ДЕЙСТВИТЕЛЬНО подавлено.Они так сильно тебя зажигают, что ты от этого никогда не оправишься.Скорее всего, вы скажете: «Винтовой Linux и их элитные ублюдки».

Я не хочу звучать негативно, но я мягкий и подходящий голос по сравнению с тем, что вы услышите от других.

4 голосов
/ 07 декабря 2010

C, а не C ++ - это язык для написания драйверов устройств (в режиме ядра), и в конечном итоге причина проста: C ++ - неподходящий язык для использования при написании программного обеспечения драйверов. Как побочный эффект этого, в режиме ядра нет доступной среды выполнения c ++.

Относительно того, почему c ++ не подходит: есть как минимум две причины:

  • Драйверы устройств во всех ОС требуют строгого размещения кода - некоторый код должен находиться в блоках, не допускающих постраничного ввода, а объем памяти, доступный для постраничного вывода, является ограниченным ресурсом. C ++ генерирует много неявного кода, так как неявно невозможен (a) провести аудит и (b) заключить в скобки необходимые директивы, чтобы гарантировать размещение.
  • исключения стали необязательными в c ++. Исключения c ++ обычно реализуются в терминах исключений ЦП, и большая часть кода драйвера выполняется на уровнях, на которых (cpu) исключения не могут быть допущены (отсюда требование для нестрабельных блоков кода).

Я думаю, что есть некоторые другие аспекты, которые я забыл, но ideomatic c ++ нарушает ряд ограничений, накладываемых на драйверы. Вот почему С является предпочтительным.

...