仅供参考:驱动程序的 Linux 特定内容(如果是 GPL)。其他都是CC0。
我对 Fedora 38 进行了首次安装。为了验证所有设置是否正确,我继续构建了我的一个驱动程序。屏幕上的输出与以前的 Fedora 版本略有不同,但这种变化很常见。新鲜的是构建需要很长时间——非常长的时间。目前,三个不同的版本已经运行了超过 22 小时。每个构建应该花费大约七分钟。查看 .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”
从通用标准网站下载驱动程序存档(版本号会随时间变化):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 并以 root 身份登录,但这些都没有帮助。
我的构建通常是通过网络在 SAMBA 安装的 Windows 10 共享上完成的。因此,我尝试在本地驱动器上进行构建,该驱动器是基于 USB 3.0 的 M.2 驱动器。没有任何改善。
然后我在 SATA 驱动器上尝试了另一个原始安装。通过网络构建或在本地 SATA 驱动器上构建时没有任何改进。
我在三个完全不同的主机上尝试了 Fedora 38 下的构建,并观察到相同的、非常慢的结果。
我在几个不同的 Fedora 安装和主机上构建了该驱动程序,以演示 Fedora 38 和一些以前的 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. Fedora 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 个不同驱动程序中的任何一个,构建花费的时间从未超过大约七分钟。相比之下,到目前为止,在新发行版和版本下设置障碍是微不足道的。 (对于那些建议我联系该驱动程序制造商的人,好吧,那就是我。)
这是我的制作文件:
生成文件:
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 秒