참고: 드라이버에 대한 Linux 관련 항목입니다(GPL인 경우). 다른 것들은 CC0입니다.
Fedora 38을 처음 설치하고 있습니다. 모든 것이 올바르게 설정되었는지 확인하기 위해 드라이버 중 하나를 구축했습니다. 화면 출력은 이전 Fedora 버전과 약간 다르지만 이러한 변경은 일반적입니다. 새로운 점은 빌드에 오랜 시간이 걸린다는 것입니다. 매우 오랜 시간이 걸립니다. 현재 세 가지 버전이 22시간 이상 실행되고 있습니다. 각 빌드에는 약 7분이 소요됩니다. .o 파일 날짜를 살펴보면 각 드라이버 소스 파일을 컴파일하는 데 약 20분이 소요된다는 점을 알 수 있습니다.
매번 약 25시간 만에 결국 성공적으로 완료됐다.
매우 느린 드라이버 빌드를 수정하는 데 도움을 찾고 있습니다. 어떤 도움이라도 대단히 감사하겠습니다.
감사합니다,
질문 생성:
"https://fedoraproject.org/workstation/download/"에서 "Intel 및 AMD x86_64 시스템용" "Fedora Workstation 38 Live ISO" 이미지를 다운로드합니다.
적절한 미디어에 설치합니다.
설치 가능한 미디어를 부팅하고 설치를 수행합니다.
원래 설치로 부팅하고 계속해서 사용자 계정 등을 생성합니다.
다양한 소프트웨어 패키지 설치: elfutils-libelf-devel, 현재 커널 버전의 경우 "kernel-headers-xxx", 현재 커널 버전의 경우 "kernel-devel-xxx"
Common Criteria 웹 사이트에서 드라이버 아카이브를 다운로드합니다(버전 번호는 시간이 지남에 따라 변경될 수 있음).http://www.generalstandards.com/downloads/24dsi6c500k.linux.2.3.104.47.1.tar.gz
압축된 패키지 압축 풀기: tar -xf ./Download/24dsi6c500k.linux.2.3.104.47.0.tar.gz
드라이버 디렉토리로 전환하십시오: cd 24dsi6c500k/driver
드라이버 빌드: make -f Makefile
일부 초기 출력이 생성되지만 빌드 출력은 약 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"
그것은 결국 이루어질 것입니다.
나는 이 문제를 해결하려고 노력 중입니다.
- 빌드의 초기 화면 출력이 여기에 표시됩니다.
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)
Fedora 38을 다시 설치하고 다시 시도했지만 개선되지 않았습니다.
사용 가능한 모든 업데이트를 적용했지만 그것도 도움이 되지 않았습니다.
또한 방화벽을 끄고 SELinux를 비활성화하고 루트로 로그인했지만 이 중 어느 것도 도움이 되지 않았습니다.
내 빌드는 일반적으로 네트워크를 통해 SAMBA가 설치된 Windows 10 공유에서 수행됩니다. 그래서 USB 3.0 기반 M.2 드라이브인 로컬 드라이브를 구축해 보았습니다. 개선이 없습니다.
그런 다음 SATA 드라이브에 또 다른 원본 설치를 시도했습니다. 네트워크나 로컬 SATA 드라이브를 통해 구축할 때 개선이 없습니다.
나는 완전히 다른 세 개의 호스트에서 Fedora 38로 빌드를 시도했지만 동일하지만 매우 느린 결과를 관찰했습니다.
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초도 채 걸리지 않습니다.