Escribir un controlador de dispositivo "Hello World" para el kernel 2.6 usando Eclipse

9

Objetivo

Estoy tratando de escribir un controlador de dispositivo simple en Ubuntu. Quiero hacer esto usando Eclipse (o un IDE mejor que sea adecuado para la programación del controlador). Aquí está el código:

#include <linux/module.h>

static int __init hello_world( void )
{
  printk( "hello world!\n" );
  return 0;
}

static void __exit goodbye_world( void )
{
  printk( "goodbye world!\n" );
}

module_init( hello_world );
module_exit( goodbye_world );

Mi esfuerzo

Después de investigar un poco, decidí usar Eclipse CTD para desarrollar el controlador (aunque todavía no estoy seguro de si es compatible con herramientas de depuración de subprocesos múltiples). Asique:

  1. Instalé Ubuntu 11.04 Desktop x86 en una máquina virtual VMWare,
  2. Instalado eclipse-cdty linux-headers-2.6.38-8 usando Synaptic Package Manager,
  3. Creé un código anterior con C Projectnombre TestDriver1y copiado,
  4. Cambió el comando de compilación predeterminado make, al siguiente comando de compilación personalizado:

make -C /lib/modules/2.6.38-8-generic/build M=/home/isaac/workspace/TestDriver1

El problema

Recibo un error cuando intento construir este proyecto usando eclipse. Aquí está el registro de la compilación:

**** Compilación de configuración de depuración para el proyecto TestDriver1 ****

make -C /lib/modules/2.6.38-8-generic/build M = / home / isaac / workspace / TestDriver1 all

make: Entrando en el directorio '/usr/src/linux-headers-2.6.38-8-generic'

make: *** Ninguna regla para hacer objetivo a vmlinux', needed bytodos '. Detener.

make: Saliendo del directorio '/usr/src/linux-headers-2.6.38-8-generic'

Curiosamente, no obtengo ningún error cuando lo uso en shelllugar de eclipseconstruir este proyecto. Para usar shell, solo creo un Makefilecontenedor obj-m += TestDriver1.oy uso el makecomando anterior para construir.

Entonces, algo debe estar mal con el eclipse Makefile. Tal vez está buscando la vmlinuxarquitectura (?) O algo mientras la arquitectura actual es x86. ¿Quizás es por VMWare?

Como entendí, eclipsecrea los archivos MAKE automáticamente y modificarlos manualmente causaría errores en el futuro O makefiledificultaría la administración .

Entonces, ¿cómo puedo compilar este proyecto en eclipse?

Isaac
fuente

Respuestas:

5

Estoy casi en la misma posición contigo. Siguiendo estas instrucciones, he tenido éxito con la construcción del núcleo en sí y con un solo módulo.

Agregué tres pasos (40 ~ 42) al artículo principal para hacer que Eclipse compile un controlador específico, no un núcleo completo.

  1. Descargue e instale Eclipse más el CDT.
  2. Configure y cree su núcleo para definir CONFIG_*y generar autoconf.h. Esto se puede hacer antes o después de descargar e instalar Eclipse.
  3. Asegúrese de tener la fuente correcta del núcleo (por ejemplo, asegúrese de estar en la rama git correcta). Si revisa otra rama más tarde, está bien, pero tendrá que volver a indexar la fuente, y eso demorará unos 20 minutos.
  4. Inicie Eclipse.
  5. Haga clic en File-> New->C Project
  6. Complete el nombre de un proyecto como my_kernel
  7. Desmarca la casilla Usar ubicación predeterminada y escribe el directorio raíz de tu núcleo en el cuadro Ubicación.
  8. En el panel Tipo de proyecto: haga clic en el proyecto Makefile y seleccione Proyecto vacío
  9. En el lado derecho, seleccione Linux GCC
  10. Haga clic en Advanced settings... y aparecerá un cuadro de diálogo Propiedades.
  11. Seleccione Recurso a la izquierda, y luego en la sección de codificación de archivo de texto, seleccione Otro y ISO-8859-1en el cuadro, luego haga clic en Aplicar
  12. Abra la C/C++ Generalselección a la izquierda.
  13. Haga clic en Preprocessor Include Paths
  14. Seleccionar GNU Cen la lista de idiomas
  15. Seleccione CDT User Setting Entriesen la lista Configuración de entradas
  16. Haga clic en Add.... Elija Archivo de macros de preprocesador en el menú desplegable superior izquierdo, Ruta del proyecto en el menú desplegable superior derecho e ingrese include/generated/autoconf.hen el cuadro de texto Archivo. (Nota: para núcleos más antiguos [anteriores a 2.6.36?], La ubicación de autoconf.hes include/linux/autoconf.h)
  17. Agregue también cualquier otro archivo de macros que esté utilizando.
  18. Haga clic en indexador
  19. Marque la casilla Habilitar ajustes específicos del proyecto.
  20. Desmarque los archivos de origen de índice no incluidos en la compilación
  21. Borre la casilla Archivos para indexar por adelantado.
  22. Haga clic en Trayectorias y símbolos a la izquierda.
  23. Seleccione la pestaña Incluye y luego seleccione GNU C
  24. Haga clic en Add...
  25. Haga clic en Workspace... luego seleccione el directorio de inclusión de su núcleo
  26. Haga otro Add, Workspace y agregue arch/architecture/include, por ejemplo,arch/powerpc/include
  27. Haz clic en la # Symbolspestaña
  28. Haga clic en Add...
  29. Establecer el nombre a __KERNEL__
  30. Establezca el valor en 1y haga clic en Aceptar
  31. Haga clic en la pestaña Ubicación de origen
  32. Haga clic en el sinuoso para su proyecto.
  33. Seleccione el elemento Filtro y haga clic en Editar filtro ...
  34. Haga clic en Agregar múltiples ... y luego seleccione todos los directorios arch / * en la fuente del núcleo que no se utilizarán (es decir, todos los que no son para la arquitectura que está utilizando)
  35. Haga clic en Aceptar y en Aceptar nuevamente para cerrar ese diálogo.
  36. Haga clic en Aceptar en el cuadro de diálogo Propiedades.
  37. Haga clic en Finalizar en el cuadro de diálogo Proyecto C.
  38. Haga clic derecho en el proyecto y seleccione Índice, luego seleccione Reconstruir
  39. Tardará unos 20 minutos en completarse.
  40. Abra la configuración de su proyecto, vaya a C/C++ build -> Behaviour (tab)
  41. Marque la Build (Incremental buil)casilla de verificación y agregue la ruta del módulo al cuadro de texto (en mi caso M=drivers/servo/dynamixel).
  42. Cuando el módulo esté listo y desee compilar el núcleo, repita 41 y reemplace M=..con all.
sorush-r
fuente
1

Si desea desarrollar controladores con eclipse, deberá hacerlo al revés.

Deberá ponerse al día con automake, autogen, pkg-config, etc., crear un proyecto de autotools e importarlo en eclipse. El eclipse-cdt debería ofrecer esto; de lo contrario, no pudo instalar el 'autotools-plugin' (no está seguro del nombre exacto, escribir esto de la memoria).

Simplemente abandone la idea de que eclipse-cdt podría administrar un Makefile decente, C no es Java, desafortunadamente o afortunadamente.

aquaherd
fuente
Gracias. Comprobaré el autotoolscomplemento pronto. ¿Conoces algún IDE mejor para la programación del controlador? ¿Crees que yo (un usuario vago de VS que no tengo experiencia en Linux) puedo manejarlo makefile? ¿Es makefilerealmente manejable en grandes proyectos?
Isaac
También era un usuario perezoso de VS y debo admitir que dominar las herramientas automáticas tiene una curva de aprendizaje pronunciada, pero vale la pena, no solo para Linux. Eclipse es uno de los mejores IDE, pero los proyectos de herramientas automáticas son tan diversos que ningún IDE puede analizar todas las posibilidades. Prueba geany si quieres hacerlo bien, prueba anjuta y codelite si te gustó VS6 pero siempre sé competente en la compilación de línea de comandos.
aquaherd
1

También soy nuevo en la programación de controladores de Linux, descubrí que hay una nueva forma de implementar módulos de kernel (que no están en el árbol oficial de Linux) llamada DKMS. El módulo se instalará como fuente y DKMS se encargará de compilarlo para cada núcleo. Significa que el Makefile para el módulo se escribirá manualmente y su fuente no se incluirá para las herramientas automáticas.

http://linux.dell.com/dkms/

actualizado...

DKMS se trasladó a http://en.community.dell.com/techcenter/os-applications/w/wiki/2463.linux-projects.aspx

Estos tutoriales / introducción rápida a DKMS (enlaces desde la página del proyecto de Dell): artículo de Linux Journal , documento de Power Solutions , documento de Ottawa Linux Symposium

DKMS utilizado para la implementación rápida de controladores. Por ejemplo, módulos de kernel que usan DKMS en mi máquina Ubuntu:

dkms status

bcmwl, 6.20.155.1+bdcom, 3.5.0-41-generic, x86_64: installed
bcmwl, 6.20.155.1+bdcom, 3.5.0-42-generic, x86_64: installed
bcmwl, 6.20.155.1+bdcom, 3.5.0-43-generic, x86_64: installed
nvidia, 313.26, 3.5.0-42-generic, x86_64: installed
nvidia, 313.26, 3.5.0-43-generic, x86_64: installed
vboxhost, 4.3.0, 3.5.0-42-generic, x86_64: installed
vboxhost, 4.3.0, 3.5.0-43-generic, x86_64: installed

Este es el código que he escrito antes, podría ser útil como DKMS Hello World. https://github.com/sneetsher/RTD-DM5408-Driver-Port-for-Linux

user.dz
fuente
1

1> puedes probar con este comando

"make" -> "/ usr / bin / make"

/usr/bin/make -C /lib/modules/2.6.38-8-generic/build M=/home/isaac/workspace/TestDriver1

2> en el directorio almacena tu código de palabra de saludo, nombre de archivo de creación "Makefile"

obj-m := NameofyourHelloWold.o 

KDIR  := /lib/modules/2.6.38-8-generic/build

PWD   := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
Namphamtien
fuente