2010-12-07 8 views
9

Quería obtener más detalles para escribir controladores de dispositivos gráficos y controladores de dispositivos de audio usando C++ para Linux. Soy novato en el desarrollo de controladores de dispositivos, por favor proporcione los detalles de desarrollo/documentación para el mismo.desarrollo de controladores de dispositivos C++ en Linux

Gracias

-Pravin

+3

Si está buscando la inclusión de mainline, C++ es la forma más segura de que su parche sea ignorado. – SingleNegationElimination

Respuesta

7

controladores de dispositivos del núcleo de Linux están escritas en C en lugar de C++.

Se accede a la mayoría de los controladores de dispositivos mediante un archivo de dispositivo especial (/ dev/yourdevice0) en el que se pueden realizar operaciones de control y lectura y escritura.

Los programas de cliente y los controladores de modo de usuario en modo de usuario abren el archivo del dispositivo y lo usan como una vía para comunicarse con el controlador de modo kernel. Estos controladores de modo de usuario podrían concebirse en C++ o en cualquier otro idioma.

En general, la mejor manera de comenzar es tener un dispositivo que necesita un controlador, y aprender lo que necesita para poder escribirlo. Y a menudo la mejor manera de hacerlo es encontrar un controlador existente para un dispositivo relacionado, o uno con paradigmas de interfaz similares, y comenzar modificando eso hasta que funcione para su nuevo dispositivo en su lugar o también.

6

Como no hay tiempo de ejecución de C++ en el kernel, se encontrará con problemas rápidamente. Supongo que podría hacer un tiempo de ejecución de C++ para ejecutar dentro del kernel, pero requeriría algunas habilidades bastante buenas. Capacidades mucho mayores que escribir el controlador en C.

Además, los desarrolladores del kernel de Linux lo sacrificarían instantáneamente. Me refiero a REALMENTE puesto. Te flamearan tanto que nunca te recuperarías. Lo más probable es que diga "Screw Linux y sus bastardos elitistas".

No quiero sonar negativo, pero soy una voz suave y adecuada en comparación con lo que escucharía de los demás.

conductores
+0

Esa es la única gran verdad. Si no fuera por una simple "decisión", no sería ninguna razón para dejar C++ fuera de la fiesta. – j4x

4

C, no se C++ es el lenguaje para escribir controladores de dispositivo (modo kernel), y la razón en última instancia es simple: C++ es un lenguaje inapropiado de usar para escribir software de controlador. Como efecto secundario de esto, no hay tiempo de ejecución de C++ disponible en modo kernel.

cuanto a por qué C++ es inapropiado: Hay al menos dos razones:

  • controladores de dispositivo en todos los OS requerir la colocación estricto código - algo de código tiene que estar en bloques no localizables, y la memoria no paginable es una recurso limitado C++ genera mucho código implícito, implícito es imposible (a) auditar, y (b) incluir las directivas necesarias para garantizar la colocación.
  • excepciones se han convertido en no opcionales en C++. Las excepciones de C++ se implementan típicamente en términos de excepciones de CPU y una gran cantidad de código de controlador se ejecuta en niveles donde no se pueden tolerar las excepciones (cpu) (de ahí el requisito de bloques de código no paginables).

Creo que hay otros aspectos que me olvido, pero ideomatic C++ infringe una serie de restricciones impuestas a los controladores. Por eso es preferible C

+1

Lo siento @Chris Becke. Está usted equivocado. Vea SeventyFive answer y Google un poco. Yo, por mi cuenta, realicé algunas pruebas bastante buenas para comparar Assembly, C y C++ cuando estaba a punto de decidir programar AVR hace 10 años y todo lo que puedo decir es: C++ genera código tan ordenado como Assembly. Solo tienes que saber cómo. No es siempre cierto para la C. simple. En caso de que tenga curiosidad: https://sourceforge.net/p/jaxos/code/HEAD/tree/ – j4x

9

Viniendo a esta página tarde, la propia pregunta ha sido respondida por Chris Stratton, pero es importante para corregir un par de cosas Chris Becke poner aquí que son conceptos erróneos comunes con las personas que no están familiarizados con C++:

  • C++ no crea código o datos implícitos, solo lo que solicita. Incluso para un programador promedio de C++, no habrá código ni datos adicionales. Lo descubrí conociendo el asma detrás de C++, pero solo leí los libros de Scott Meyers, es lo suficientemente bueno.
  • Las excepciones no solo son opcionales en C++, sino que se puede excluir su código completo para la mayoría de las herramientas disponibles. Esto de hecho se hace en aplicaciones RT.

Esto es para abordar los conceptos erróneos publicados aquí. Para agregar más sin embargo:

1) Un programador de C++ novato puede hacer tonterías, pero un programador de C principiante que intenta implementar por sí mismo el polimorfismo y la herencia como hace una y otra vez en el kernel simplemente sin llamarlo así, hará muchas tonterías más ineficientes e indegogables.

2) Diciendo eso, lo único que se puede crear en la base C++ es un puntero virtual SI LO NECESITA y especifique "virtual", y luego también los programadores C solo crean un puntero manipularlo por sí mismos agregar búsqueda tablas y obtener errores mucho más difíciles en la línea debido a ello. Como siempre en C++, si no menciona "virtual", ni siquiera obtiene este puntero. La herencia y la encapsulación son, por supuesto, completamente libres de gastos generales.

3) C++ crea la misma cantidad de ASM y la memoria como C si no lo hace EXPLICITAMENTE solicitar características especiales, pero hay un caso común cuando C++ es más eficiente - al pasar punteros de función. Si usas los funtores de C++, puedes alinear la función puntiaguda. Esto es EXTREMADAMENTE útil en aplicaciones integradas.

4) Si RT integrado usa C++, ¿por qué no funciona Linux? Solo por mitos, así que lea este mensaje detenidamente y consulte scott meyers o mejor aún el asm. Tengo 20 años en RT y tuve la misma incredulidad en C++ cuando cambié hace 14 años, pero los hechos no confirman tal desconfianza.

TL; DR - es muy fácil escribir de manera eficiente y en un caso común un código más eficiente en C++, estudios, mucha experiencia en la industria y libros abundan en este tema.

+2

No podría haber escrito mejor. Los usuarios de Linux desordenan su código con montones de macros intentando que sea legible (para ellos) y todo lo que puedo pensar es que C++ ya les proporciona casi todas las herramientas necesarias sin tener que recurrir al preprocesador y, como dijo @SeventyFive, con sin carga, sin costo adicional. Al final, los chicos de Linux son asombrosos programadores en C, pero tal vez no saben lo suficiente de C++. – j4x

Cuestiones relacionadas