최근에 "Linux Kernel Module 프로그래밍 가이드"라는 책을 사용하여 커널 모듈 프로그래밍을 배우기 시작했지만 이것이 어떻게 작동하는지 이해하지 못합니다.
obj-m += hello-1.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
나는 makefile의 기본 사항을 이해하지만 이것은 복잡해 보입니다. 적어도 make clean be rm hello-1.ko?
답변1
다음은 이 makefile에서 발생하는 일에 대한 자세한 설명입니다.
어딘가에 객체 목록이 있고 "hello-1.o"가 목록에 추가됩니다.
obj-m += hello-1.o
요구사항 없이 all이라는 대상을 만듭니다. 이 모든 작업을 수행하는 방법은 시스템이 실행 중인 현재 커널 버전의 이름을 딴 디렉터리의 빌드 디렉터리(/lib 아래 모듈 디렉터리에 있음)로 변경하는 것입니다. 변수를 저장하면 변수에는 make라고 하는 현재 작업 디렉터리가 포함됩니다. 이제 방금 변경한 디렉토리에서 make 파일을 찾아 대상 모듈을 빌드합니다.
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
이것은 거의 동일하며 독자에게 연습 문제로 남겨집니다.
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
클린이 한 번 이상인 이유 rm
는 커널에 모두 함께 작동하는 별도의 부분이 많이 있기 때문입니다. 모놀리식 메이크파일을 작성하는 것은 기껏해야 고통스럽지만 실제로 유지하기는 어렵습니다. 따라서 빌드 디렉터리의 각 논리적 부분에는 조정 makefile에서 호출할 수 있는 자체 makefile이 있습니다. Makefile은 매우 번거로울 수 있으므로 집중하고 유지 관리할 수 있도록 유지하는 것이 가장 좋습니다.