GPL/CCO:Fedora 38 驱动程序模块构建需要数小时而不是几分钟

GPL/CCO:Fedora 38 驱动程序模块构建需要数小时而不是几分钟

仅供参考:驱动程序的 Linux 特定内容(如果是 GPL)。其他都是CC0。

我对 Fedora 38 进行了首次安装。为了验证所有设置是否正确,我继续构建了我的一个驱动程序。屏幕上的输出与以前的 Fedora 版本略有不同,但这种变化很常见。新鲜的是构建需要很长时间——非常长的时间。目前,三个不同的版本已经运行了超过 22 小时。每个构建应该花费大约七分钟。查看 .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. 从通用标准网站下载驱动程序存档(版本号会随时间变化):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 并以 root 身份登录,但这些都没有帮助。

  4. 我的构建通常是通过网络在 SAMBA 安装的 Windows 10 共享上完成的。因此,我尝试在本地驱动器上进行构建,该驱动器是基于 USB 3.0 的 M.2 驱动器。没有任何改善。

  5. 然后我在 SATA 驱动器上尝试了另一个原始安装。通过网络构建或在本地 SATA 驱动器上构建时没有任何改进。

  6. 我在三个完全不同的主机上尝试了 Fedora 38 下的构建,并观察到相同的、非常慢的结果。

  7. 我在几个不同的 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 秒

相关内容