注:ドライバのLinux関連エントリ(GPLの場合)。その他はCC0です。
Fedora 38を初めてインストールしています。すべてが正しく設定されていることを確認するためにドライバの1つを構築しました。画面出力は以前のFedoraバージョンとは少し異なりますが、これらの変更は一般的です。新しい点は、ビルドに長い時間がかかるということです。非常に長い時間がかかります。現在、3つのバージョンが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 Webサイトからドライバアーカイブをダウンロードします(バージョン番号は時間の経過とともに変更されることがあります)。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ドライブを介して構築する場合、改善はありません。
私は完全に異なる3つのホストから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. 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のドライバのうち、ビルドに約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秒もかかりません。