Desarrollo de módulos de kernel para el desarrollo de controladores de Linux (2): introducción a la compilación de módulos de kernel Makefile

Reenviado desde: http://blog.csdn.net/zqixiao_09/article/details/50838043

1. Compilación de módulos

       En la parte del trasplante de controladores en la compilación anterior del kernel, mencionamos que la compilación del controlador se divide en compilación estática y compilación dinámica ; la compilación estática consiste en compilar el controlador directamente en el kernel y la compilación dinámica consiste en compilar el controlador en módulos.

Hay dos tipos de compilación dinámica:

a -- compilación interna

       Compilar en el directorio fuente del kernel

b -- compilación externa

       Compilar fuera del directorio fuente del kernel

 

En segundo lugar, el análisis del proceso de compilación específico   

        Nota: Esta compilación es una compilación externa, el código fuente del kernel utilizado es el código fuente de Ubuntu, no el código fuente del kernel de Linux 3.14 utilizado por la placa de desarrollo, y la plataforma operativa es X86.

        Para un módulo de controlador de dispositivo Linux ordinario, el siguiente es un código de archivo MAKE clásico. El uso del siguiente archivo MAKE puede completar la compilación de la mayoría de los controladores. Al usarlo, solo necesita modificar el nombre del controlador que se compilará y generará. Simplemente modifique el valor de obj-m.

 

ifneq ($(LIBERACIÓN DEL NÚCLEO),)

obj-m:=hola.o

demás

KDIR := /lib/módulos/$(shell uname -r)/construir

PWD:=$(contraseña de shell)

todo:

    hacer -C $(KDIR) M=$(PWD) módulos

limpio:

    rm -f *.ko *.o *.symvers *.cmd *.cmd.o

terminara si

 

 

1. Variables en el archivo MAKE

    Primero explique el significado de algunas variables en el siguiente archivo MAKE:

(1) KERNELRELEASE            se define en el archivo MAKE de nivel superior en el código fuente del kernel de Linux

(2) Shell pwd                              obtiene la ruta de trabajo actual

(3) shell uname -r                     obtiene el número de versión del núcleo actual

(4) KDIR                                      El directorio del código fuente del kernel actual.

Hay dos directorios sobre el código fuente de Linux, a saber

 "/lib/módulos/$(shell uname -r)/construir"

"/usr/src/linux-cabecera-$(shell uname -r)/"

       Pero si ha compilado el kernel, sabrá que el código fuente en el directorio usr generalmente lo descargamos y descomprimimos nosotros mismos, mientras que el código fuente en el directorio lib se copia automáticamente durante la compilación. mismo, así que a veces Establezca el directorio de origen del núcleo en /usr/src/linux-header-$(shell uname -r)/. El directorio del código fuente del kernel se puede modificar según su propia ubicación de almacenamiento.

(5) hacer -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) módulos

Esto es lo que compila el módulo:

a -- Primero cambie el directorio a la ubicación especificada por la opción -C (es decir, el directorio del código fuente del núcleo ), donde se guarda el archivo MAKE de nivel superior del núcleo;

b - - La opción M= hace que el archivo MAKE regrese al directorio del código fuente del módulo antes de construir el destino de los módulos ; luego, el destino de los módulos apunta al módulo establecido en la variable obj-m ; en el ejemplo anterior, establecemos la variable en hola .o.

 

2. Pasos de ejecución de make

a -- Al ingresar por primera vez, la macro "KERNELRELEASE" no está definida, así que ingrese otra cosa;

b -- registrar la ruta del kernel, registrar la ruta actual;

       Dado que no hay un destino detrás de make, make ejecutará el primer destino en el Makefile que no comience con . como destino predeterminado. Por defecto, ejecuta toda esta regla.

c -- hacer -C $(KDIR) M=$(PWD) módulo s

    -C Ingrese al directorio del kernel para ejecutar el Makefile, se le asignará un valor a KERNELRELEASE durante la ejecución, M=$(PWD) significa regresar al directorio actual, ejecutar el makefile nuevamente, los módulos se compilan en módulos

     Entonces, lo que realmente funciona aquí es

     make -C /lib/modules/2.6.13-study/build M=/home/fs/code/1/module/hello/modules

d -- Vuelva a ejecutar el archivo MAKE , KERNELRELEASE tendrá un valor y se ejecutará obj-m:=hello.o

     obj-m: significa vincular hello.o y otros archivos de objeto en un archivo de módulo hello.ko, y compilar hello.c en un archivo hello.o primero al compilar

 

Se puede ver que make se llama 3 veces aquí

   1) -- make
   2) -- Se invoca y genera el makedile de nivel superior del árbol de fuentes del kernel de Linux. o archivo
   3) -- llamada makefile del árbol de fuentes del kernel de Linux, vincular el archivo .o al archivo ko

 

3. Compilar múltiples archivos

Si hay varios archivos de origen, use el siguiente método:

obj-m := hola.o

hola-objs := archivo1.o archivo2.o archivo3.o

 

3. Instrucciones simples para la compilación interna

        Si mueve el módulo hello al código fuente del kernel. Por ejemplo, póngalo en /usr/src/linux/driver/, se definirá KERNELRELEASE.

     En /usr/src/linux/Makefile hay KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)$(LOCALVERSION).

En este momento, el módulo hello ya no se compila solo con make, sino que se compila con módulos make en el núcleo.En este momento, el módulo del controlador se compila con el kernel.

Supongo que te gusta

Origin blog.csdn.net/g1093896295/article/details/82813859
Recomendado
Clasificación