Entendendo um arquivo make para fazer arquivos .ko

2

Eu sei o propósito deste arquivo make; é o Makefile de um driver, que invocaria o sistema de compilação do kernel a partir da origem do kernel. Mas não é possível entender exatamente o que está acontecendo.

# Makefile – makefile of our first driver

# if KERNELRELEASE is not defined, we've been called directly from the command line.
# Invoke the kernel build system.
ifeq (${KERNELRELEASE},)
    KERNEL_SOURCE := /usr/src/linux
    PWD := $(shell pwd)
default:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules

clean:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} clean

# Otherwise KERNELRELEASE is defined; we've been invoked from the
# kernel build system and can use its language.
else
    obj-m := ofd.o
endif

Por exemplo, o que está acontecendo aqui:

 '${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules

e aqui:

obj-m := ofd.o' 

Alguém pode me ajudar a entender isso colocando mais alguns comentários?

Eu peguei isso deste link .

Este arquivo de criação tem um arquivo .c associado (driver);

/* ofd.c – Our First Driver code */

#include <linux/module.h>
#include <linux/version.h>
#include <linux/kernel.h>

static int __init ofd_init(void) /* Constructor */
{
    printk(KERN_INFO "Namaskar: ofd registered");

    return 0;
}

static void __exit ofd_exit(void) /* Destructor */
{
    printk(KERN_INFO "Alvida: ofd unregistered");
}

module_init(ofd_init);
module_exit(ofd_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Anil Kumar Pugalia <[email protected]>");
MODULE_DESCRIPTION("Our First Driver");
    
por gpuguy 29.03.2014 / 11:39

1 resposta

5

Como explicado nos comentários do Makefile, há duas partes neste Makefile. Isso porque será lido duas vezes. Primeiro, quando você chama make na linha de comando, então pelo kbuild.

# if KERNELRELEASE is not defined, we've been called directly from the     command line.
# Invoke the kernel build system.
ifeq (${KERNELRELEASE},)
    KERNEL_SOURCE := /usr/src/linux
    PWD := $(shell pwd)
default:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules

clean:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} clean

Se KERNELRELEASE não estiver definido, é porque o arquivo é lido por make. Você tem um Makefile que chama make com a opção -C para alterar o diretório para onde sua origem do kernel está.

Make então lê o Makefile lá (no diretório de origem do kernel). SUBDIRS é onde está o código-fonte do seu módulo. (Acho que SUBDIRS está obsoleto e M é usado agora).

O sistema de compilação do kernel irá procurar pelo Makefile no diretório do seu módulo para saber o que construir. KERNELRELEASE será definido, então essa parte será usada:

# Otherwise KERNELRELEASE is defined; we've been invoked from the
# kernel build system and can use its language.
else
    obj-m := ofd.o
endif

Você encontrará mais informações em a documentação do kernel .

    
por 29.03.2014 / 13:02

Tags