나는 이 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가 파일을 읽기 때문입니다. make를 호출하고 선택적으로 -C
디렉토리를 커널 소스가 있는 곳으로 변경하는 Makefile이 있습니다 .
그런 다음 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
자세한 내용은 다음에서 확인할 수 있습니다.커널 문서.