GPL/CCO: Fedora 38 드라이버 모듈 빌드는 몇 분이 아닌 몇 시간이 걸립니다.

GPL/CCO: Fedora 38 드라이버 모듈 빌드는 몇 분이 아닌 몇 시간이 걸립니다.

참고: 드라이버에 대한 Linux 관련 항목입니다(GPL인 경우). 다른 것들은 CC0입니다.

Fedora 38을 처음 설치하고 있습니다. 모든 것이 올바르게 설정되었는지 확인하기 위해 드라이버 중 하나를 구축했습니다. 화면 출력은 이전 Fedora 버전과 약간 다르지만 이러한 변경은 일반적입니다. 새로운 점은 빌드에 오랜 시간이 걸린다는 것입니다. 매우 오랜 시간이 걸립니다. 현재 세 가지 버전이 22시간 이상 실행되고 있습니다. 각 빌드에는 약 7분이 소요됩니다. .o 파일 날짜를 살펴보면 각 드라이버 소스 파일을 컴파일하는 데 약 20분이 소요된다는 점을 알 수 있습니다.

매번 약 25시간 만에 결국 성공적으로 완료됐다.

매우 느린 드라이버 빌드를 수정하는 데 도움을 찾고 있습니다. 어떤 도움이라도 대단히 감사하겠습니다.

감사합니다,

질문 생성:

  1. "https://fedoraproject.org/workstation/download/"에서 "Intel 및 AMD x86_64 시스템용" "Fedora Workstation 38 Live ISO" 이미지를 다운로드합니다.

  2. 적절한 미디어에 설치합니다.

  3. 설치 가능한 미디어를 부팅하고 설치를 수행합니다.

  4. 원래 설치로 부팅하고 계속해서 사용자 계정 등을 생성합니다.

  5. 다양한 소프트웨어 패키지 설치: elfutils-libelf-devel, 현재 커널 버전의 경우 "kernel-headers-xxx", 현재 커널 버전의 경우 "kernel-devel-xxx"

  6. Common Criteria 웹 사이트에서 드라이버 아카이브를 다운로드합니다(버전 번호는 시간이 지남에 따라 변경될 수 있음).http://www.generalstandards.com/downloads/24dsi6c500k.linux.2.3.104.47.1.tar.gz

  7. 압축된 패키지 압축 풀기: tar -xf ./Download/24dsi6c500k.linux.2.3.104.47.0.tar.gz

  8. 드라이버 디렉토리로 전환하십시오: cd 24dsi6c500k/driver

  9. 드라이버 빌드: make -f Makefile

  10. 일부 초기 출력이 생성되지만 빌드 출력은 약 20분마다 소스 파일을 컴파일하여 계속됩니다. 마지막 단계는 더 오래 걸립니다.

생성된 출력은 다음과 같습니다.

make[1]: Entering directory '/usr/src/kernels/6.2.9-300.fc38.x86_64'
warning: the compiler differs from the one used to build the kernel
  The kernel was built by: gcc (GCC) 13.0.1 20230318 (Red Hat 13.0.1-0)
  You are using:           gcc (GCC) 13.0.1 20230401 (Red Hat 13.0.1-0)
  CC [M]  /root/c/gsc/24dsi6c500k/linux/driver/close.o
  CC [M]  /root/c/gsc/24dsi6c500k/linux/driver/device.o
  CC [M]  /root/c/gsc/24dsi6c500k/linux/driver/io.o
....
  CC [M]  /root/c/gsc/24dsi6c500k/linux/driver/os_spinlock.o
  CC [M]  /root/c/gsc/24dsi6c500k/linux/driver/os_time.o
  CC [M]  /root/c/gsc/24dsi6c500k/linux/driver/os_write.o"

그것은 결국 이루어질 것입니다.

나는 이 문제를 해결하려고 노력 중입니다.

  1. 빌드의 초기 화면 출력이 여기에 표시됩니다.
warning: the compiler differs from the one used to build the kernel
  The kernel was built by: gcc (GCC) 13.0.1 20230318 (Red Hat 13.0.1-0)
  You are using:           gcc (GCC) 13.2.1 20230728 (Red Hat 13.2.1-0)

속도 저하가 컴파일러 문제일 수 있다고 가정하고 gcc를 커널 빌드에 사용되는 것으로 보고된 버전으로 다운그레이드했습니다. 이제 초기 출력은 다음과 같지만 빌드가 여전히 매우 느립니다.

warning: the compiler differs from the one used to build the kernel
  The kernel was built by: gcc (GCC) 13.0.1 20230318 (Red Hat 13.0.1-0)
  You are using:           gcc (GCC) 13.0.1 20230401 (Red Hat 13.0.1-0)
  1. Fedora 38을 다시 설치하고 다시 시도했지만 개선되지 않았습니다.

  2. 사용 가능한 모든 업데이트를 적용했지만 그것도 도움이 되지 않았습니다.

  3. 또한 방화벽을 끄고 SELinux를 비활성화하고 루트로 로그인했지만 이 중 어느 것도 도움이 되지 않았습니다.

  4. 내 빌드는 일반적으로 네트워크를 통해 SAMBA가 설치된 Windows 10 공유에서 수행됩니다. 그래서 USB 3.0 기반 M.2 드라이브인 로컬 드라이브를 구축해 보았습니다. 개선이 없습니다.

  5. 그런 다음 SATA 드라이브에 또 다른 원본 설치를 시도했습니다. 네트워크나 로컬 SATA 드라이브를 통해 구축할 때 개선이 없습니다.

  6. 나는 완전히 다른 세 개의 호스트에서 Fedora 38로 빌드를 시도했지만 동일하지만 매우 느린 결과를 관찰했습니다.

  7. Fedora 38 및 일부 이전 Fedora 버전의 빌드 시간을 보여주기 위해 몇 가지 다른 Fedora 설치 및 호스트에 드라이버를 빌드했습니다.

A. Fedora 38, 64비트, 8코어, 3.6GHz, 8GB, 2년 된 마더보드(Gigabyte Z390 Designare), Samba 설치: 현재까지 22시간

B. Fedora 38, 64비트, 8코어, 3.6GHz, 8GB, 2년 된 마더보드(Gigabyte Z390 Designare), SATA 드라이브: 현재까지 22시간

C. Fedora 38, 64비트, 8코어, 3.2GHz, 32GB, 7년 된 마더보드(Asus X99-A/USB 3.1), USB 3 M.2: 현재까지 22시간

D. Fedora 37, 64비트, 2코어, 2.5GHz, 8GB, 12년 된 마더보드(Asus X99-A/USB 3.1), USB 2 M.2: 7분

E. 페도라 36, 64비트, 2코어, 2.5GHz, 8GB, 12년 된 마더보드(Super X7SBA), SATA 드라이브: 7분

F. Fedora 3, 32비트, 2코어, 2.2GHz, 1GB, 20년 된 마더보드(Iwill DP400), IEDE 드라이버: 37초

수년에 걸쳐 저는 Fedora Core 3 이후 모든 공식 Fedora 릴리스와 기타 여러 배포판을 사용해 왔습니다. 제가 수천 번 작성하고, 유지 관리하고, 구축한 45개의 드라이버 중 빌드에 약 7분 이상 소요된 적이 없습니다. 지금까지 새로운 릴리스와 버전에 장벽을 두는 것은 비교적 사소한 일이었습니다. (이 드라이버 제조업체에 문의하라고 제안한 사람들은 바로 저입니다.)

이것은 내 make 파일입니다.

파일 생성:

TARGET      := 24dsi6c500k

.NOTPARALLEL: %.o

OBJ_FILES   =                   \
            close.o             \
            device.o            \
            io.o                \
            ioctl.o             \
            irq.o               \
            open.o              \
            read.o              \
            reg.o               \
                                \
            gsc_bar.o           \
            gsc_close.o         \
            gsc_dma.o           \
            gsc_dma_pci.o       \
            gsc_eeprom.o        \
            gsc_endian.o        \
            gsc_endian_pci.o    \
            gsc_init.o          \
            gsc_io.o            \
            gsc_ioctl.o         \
            gsc_irq.o           \
            gsc_irq_pci.o       \
            gsc_open.o          \
            gsc_read.o          \
            gsc_reg.o           \
            gsc_utils.o         \
            gsc_wait.o          \
            gsc_write.o         \
                                \
            os_bar.o            \
            os_close.o          \
            os_event.o          \
            os_init.o           \
            os_ioctl.o          \
            os_irq.o            \
            os_kernel_2_2.o     \
            os_kernel_2_4.o     \
            os_kernel_2_6.o     \
            os_kernel_3.o       \
            os_kernel_4.o       \
            os_kernel_5.o       \
            os_kernel_6.o       \
            os_mem.o            \
            os_metrics.o        \
            os_open.o           \
            os_pci.o            \
            os_proc.o           \
            os_read.o           \
            os_reg.o            \
            os_sem.o            \
            os_spinlock.o       \
            os_time.o           \
            os_write.o



###############################################################################
# Everything here is needed so we can access os_makefile.inc.

.EXPORT_ALL_VARIABLES:

# Locate the source from the starting directory.
ifndef GSC_DEV_DIR
GSC_DEV_DIR := $(shell pwd)
endif

include ${GSC_DEV_DIR}/os_makefile.inc

os_makefile.inc:

default: all

# Identify the /dev/nul(l) device
NULL    := $(shell ls /dev/nu[l]* | grep -w null | wc -l )
NULL    := $(shell expr ${NULL})

ifeq ("${NULL}","1")
NULL    := /dev/null
else
NULL    := /dev/nul
endif

.PHONY: all clean default makefile release

# Most of this is ignored by the 2.6 (and later) module builder.
CC          = gcc
CC_FLAGS    += -c -O6 -pipe -fomit-frame-pointer -Wall
CC_FLAGS    += -D__KERNEL__ -DLINUX
CC_FLAGS    += -I. -I${KERNELDIR}
DEP_FILE    = ${GSC_DEV_DIR}/makefile.dep
KERNELDIR   =
KERNELVER   = $(shell uname -r | cut -d . -f1-2 )
KERNELMAJOR = $(shell uname -r | cut -d . -f1 )
RELEASE_RM  = ${OBJ_FILES} .tmp* .*.o.cmd .*.ko.cmd .*.mod.cmd .*.ko.*.cmd *.ko.unsigned *.mod.* *.mod Modules*



# kernel 2.2 ==================================================================
ifeq ("${KERNELVER}","2.2")
KERNELDIR   = /usr/src/linux
MODULE_NAME = ${TARGET}.o

${MODULE_NAME}: ${OBJ_FILES}
    @echo ==== Linking: $@
    @ld -r -o $@ ${OBJ_FILES}
endif

# kernel 2.4 ==================================================================
ifeq ("${KERNELVER}","2.4")

K_DIR   := $(shell ls -d /usr/src/linux/include 2>/dev/null | wc -l )
K_DIR   := $(shell echo $(K_DIR) | sed -e 's/[ \t]*//g')

ifeq ("${K_DIR}","1")
KERNELDIR   = /usr/src/linux/include
else
KERNELDIR   = /usr/src/linux-2.4/include
endif

MODULE_NAME = ${TARGET}.o

${MODULE_NAME}: ${OBJ_FILES}
    @echo ==== Linking: $@
    @ld -r -o $@ ${OBJ_FILES}
endif

# kernel 2.6 ==================================================================
ifeq ("${KERNELVER}","2.6")

${TARGET}-objs  = ${OBJ_FILES}
KERNELDIR       = /lib/modules/$(shell uname -r)/build
MODULE_NAME     = ${TARGET}.ko
obj-m           = ${TARGET}.o
PWD             = $(shell pwd)
RELEASE_RM      += ${TARGET}.o Module.symvers

${MODULE_NAME}: $(shell ls ${GSC_DEV_DIR}/*.[ch])
    @-chmod +rw ${DEP_FILE}
    @-echo -n > ${DEP_FILE}
    @make -C ${KERNELDIR} SUBDIRS=${PWD} modules
    @strip -d --strip-unneeded $@
    @rm -f *.mod.c
endif

# kernel 3.x ==================================================================
ifeq ("${KERNELMAJOR}","3")

${TARGET}-objs  = ${OBJ_FILES}
KERNELDIR       = /lib/modules/$(shell uname -r)/build
MODULE_NAME     = ${TARGET}.ko
obj-m           = ${TARGET}.o
PWD             = $(shell pwd)
RELEASE_RM      += ${TARGET}.o Module.symvers

${MODULE_NAME}: $(shell ls ${GSC_DEV_DIR}/*.[ch])
    @-chmod +rw ${DEP_FILE}
    @-echo -n > ${DEP_FILE}
    @make -C ${KERNELDIR} SUBDIRS=${PWD} modules
    @strip -d --strip-unneeded $@
    @rm -f *.mod.c
endif

# kernel 4.x ==================================================================
ifeq ("${KERNELMAJOR}","4")

${TARGET}-objs  = ${OBJ_FILES}
KERNELDIR       = /lib/modules/$(shell uname -r)/build
MODULE_NAME     = ${TARGET}.ko
obj-m           = ${TARGET}.o
PWD             = $(shell pwd)
RELEASE_RM      += ${TARGET}.o Module.symvers

${MODULE_NAME}: $(shell ls ${GSC_DEV_DIR}/*.[ch])
    @-chmod +rw ${DEP_FILE}
    @-echo -n > ${DEP_FILE}
    @make -C ${KERNELDIR} SUBDIRS=${PWD} modules
    @strip -d --strip-unneeded $@
    @rm -f *.mod.c
endif

# kernel 5.x ==================================================================
ifeq ("${KERNELMAJOR}","5")

${TARGET}-objs  = ${OBJ_FILES}
KERNELDIR       = /lib/modules/$(shell uname -r)/build
MODULE_NAME     = ${TARGET}.ko
obj-m           = ${TARGET}.o
PWD             = $(shell pwd)
RELEASE_RM      += ${TARGET}.o Module.symvers

${MODULE_NAME}: $(shell ls ${GSC_DEV_DIR}/*.[ch])
    @-chmod +rw ${DEP_FILE}
    @-echo -n > ${DEP_FILE}
    @make -C ${KERNELDIR} M=${PWD} modules
    @strip -d --strip-unneeded $@
    @rm -f *.mod.c
endif

# kernel 6.x ==================================================================
ifeq ("${KERNELMAJOR}","6")

${TARGET}-objs  = ${OBJ_FILES}
KERNELDIR       = /lib/modules/$(shell uname -r)/build
MODULE_NAME     = ${TARGET}.ko
obj-m           = ${TARGET}.o
PWD             = $(shell pwd)
RELEASE_RM      += ${TARGET}.o Module.symvers

${MODULE_NAME}: $(shell ls ${GSC_DEV_DIR}/*.[ch])
    @-chmod +rw ${DEP_FILE}
    @-echo -n > ${DEP_FILE}
    @make -C ${KERNELDIR} M=${PWD} modules
    @strip -d --strip-unneeded $@
    @rm -f *.mod.c
endif

# kernel OTHER ================================================================
ifeq ("${KERNELDIR}","")

KERNELDIR   = KERNELDIR_os_makefile.inc_not_known_at_this_time
MODULE_NAME = MODULE_NAME_os_makefile.inc_not_known_at_this_time

${MODULE_NAME}:
    @echo ERROR: KERNEL ${KERNELVER} IS NOT SUPPORTED BY THIS MAKEFILE.
    @_ERROR_ERROR_ERROR_ERROR_ERROR_ERROR_ERROR_ERROR_ERROR
endif



# COMMON ======================================================================

#This is ignored by the 2.6 (and later) module builder.
.c.o:
    @echo == Compiling: $<
    @-chmod +rw ${DEP_FILE}
    @# Get the dependency list for this module.
    @-${CC} -MM ${CC_FLAGS} $< >  .tmp1
    @# Remove trailing white space and backslash, if present.
    @-sed -e "s/[ ]*[\\\\]//g" < .tmp1 > .tmp2
    @# Put everything on seperate lines.
    @-tr [:space:] \\n < .tmp2 > .tmp3
    @# Remove all of the system include files.
    @-grep -v "^[ ]*/" < .tmp3 > .tmp4
    @# Remove all empty lines.
    @-grep [[:alnum:]] < .tmp4 > .tmp5
    @# Put everything on the same line.
    @-tr '\n' '\040' < .tmp5 > .tmp6
    @-echo -e '\012' >> .tmp6
    @# Add all the other dependencies to the end of this file.
    @-echo >> ${DEP_FILE}
    @-grep -v "^[ ]*$@" < ${DEP_FILE} >> .tmp6
    @# Remove blank lines from the list.
    @-grep "[[:alnum:]]" < .tmp6 > .tmp7
    @# Sort the list and put it in the dependency file.
    @-sort < .tmp7 > ${DEP_FILE}
    @# Cleanup.
    @rm -f .tmp?
    @rm -r -f -d .tmp*\*
    @# Compile the module.
    @${CC} ${CC_FLAGS} $< -o $@



all: ${MODULE_NAME}
    @echo ==== All Done

release: ${MODULE_NAME}
    @rm -rf  ${RELEASE_RM}
    @echo ==== Release Done

clean:
    @echo ==== Cleaning ${MODULE_NAME} ...
    @rm -rf ${RELEASE_RM} *.o *.scc *.ko core Module.markers modules.order .cache.* .Module.* .modules.*
    @echo > ${DEP_FILE}

${DEP_FILE}:
    @echo ==== Creating: $@
    @echo > ${DEP_FILE}
    @-chmod +rw ${DEP_FILE}

include ${DEP_FILE}

makefile.dep:

(커널 버전 2.6 이상에서는 빈 파일은 기본적으로 무시됩니다)

답변1

상태가 해결되었습니다. Makefile의 ".EXPORT_ALL_VARIABLES:" 줄은 열거형의 재귀적 인스턴스를 생성합니다. 이 줄은 삭제되었습니다. 나중에 make 파일에서 실제로 필요한 유일한 변수를 내보내는 줄로 대체되었습니다. 이제 빌드에 20초도 채 걸리지 않습니다.

관련 정보