разработка драйверов устройств c++ в linux

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

спасибо

-Pravin

5 ответов


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

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

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

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


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

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

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

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

2) говоря, что единственное, что может быть создано в базе C++, это виртуальный указатель, если вам это нужно, и укажите "виртуальный", а затем программисты C обычно просто создают такой указатель, манипулируют им сами добавляют таблицы поиска и получают гораздо более сложные ошибки в строке из-за этого. Как всегда в C++, если вы не упоминаете "виртуальный", вы даже не получите этот указатель. Наследование и инкапсуляция, конечно, полностью без накладных расходов.

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

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

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


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

кроме того, вы будете немедленно подавлены разработчиками ядра Linux. Я имею в виду действительно положить вниз. Они сожгут тебя так сильно, что ты никогда не оправишься от этого. Скорее всего, вы скажете: "к черту Linux и их элитарные ублюдки".

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


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


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

Что касается того, почему c++ неуместен: есть по крайней мере две причины:

  • драйверы устройств на всех ОС требуют строгого размещения кода - некоторый код должен быть в нестраничных блоках, а нестраничная память ограниченный ресурс. c++ генерирует много неявного кода, будучи неявным его невозможно (а) аудит, и (Б) скобки с необходимыми директивами, чтобы гарантировать размещение.
  • исключения стали необязательными в c++. исключения c++ обычно реализуются с точки зрения исключений CPU, и много кода драйвера выполняется на уровнях, где исключения (cpu) не могут быть допущены (следовательно, требование для неперекачиваемых блоков кода).

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