2010-12-07 2 views
9

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

Благодаря

-Pravin

+3

Если вы нацелены на включение mainline, C++ - самый надежный способ игнорировать ваш патч. – SingleNegationElimination 2010-12-07 07:01:23

ответ

7

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

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

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

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

6

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

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

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

драйверов
+0

Это единственное замечательное. Если бы это было не просто «решение», это не было бы причиной, почему бы оставить C++ вне партии. – j4x 2017-07-06 20:04:29

4

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

Как почему C++ является несоответствующим: Есть по крайней мере две причины:

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

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

+1

Извините @ Крис Бекке. Вы неправы. См. Ответ SeventyFive и Google вокруг немного. Я сам по себе провел несколько хороших тестов для сравнения Assembly, C и C++, когда я собирался решить, как программировать AVR 10 лет назад, и все, что я могу сказать, - это: C++ генерирует код как опрятный, как Assembly. Вы просто должны знать, как это сделать. Это не всегда верно для простого C. На всякий случай вам любопытно: https://sourceforge.net/p/jaxos/code/HEAD/tree/ – j4x 2017-07-06 20:01:20

9

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

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

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

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

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

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

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

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

+2

Я не мог бы написать лучше. Ликеры Linux загромождают свой код множеством макросов, пытаясь сделать его доступным для чтения (для них), и все, что я могу думать, это то, что C++ уже предоставляет им почти все необходимые инструменты для него, не возвращаясь к препроцессору и, как сказал @SeventyFive, с без нагрузки, без дополнительной оплаты. В конце концов, ребята из Linux - замечательные программисты на C, но, возможно, они недостаточно знают C++. – j4x 2017-07-06 19:54:50