Понимание файла make для создания файлов .ko

Понимание файла make для создания файлов .ko

Я знаю назначение этого make-файла; это Makefile драйвера, который будет вызывать систему сборки ядра из исходного кода ядра. Но не могу понять, что именно происходит.

# 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

Например, вот что происходит здесь:

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

и здесь:

obj-m := ofd.o` 

Может ли кто-нибудь помочь мне понять это, оставив еще несколько комментариев?

Я взял это отсюдасвязь.

Этот make-файл имеет связанный с ним файл .c (драйвер);

/* 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");

решение1

Как объясняется в комментариях к Makefile, этот Makefile состоит из двух частей. Это потому, что он будет прочитан дважды. Сначала, когда вы вызываете make в командной строке, затем 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

Если KERNELRELEASEне определено, то это потому, что файл читается make. У вас есть Makefile, который вызывает make с возможностью -Cизменить каталог, где находится исходный код ядра.

Затем Make считывает Makefile оттуда (в исходном каталоге ядра). SUBDIRSЭто то место, где находится исходный код вашего модуля. (Я думаю, SUBDIRSчто это устарело и Mтеперь вместо этого используется).

Система сборки ядра будет искать Makefile в каталоге вашего модуля, чтобы узнать, что именно нужно собрать. KERNELRELEASEбудет установлен, поэтому будет использоваться эта часть:

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

Более подробную информацию вы найдете вдокументация ядра.

Связанный контент