我正试图从x86_64机器构建一个简单的arm64机器内核模块。目标和主机都使用ubuntu 20.04作为操作系统。首先,我尝试使用这个Makefile为主机(x86_64(构建一个简单的内核模块。顺便说一下,在我的例子中,uname -r
给出了5.4.0-77-泛型。
obj-m += chr_drv_ex1.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
程序构建和运行正常。
现在我想为arm64 ubuntu 20.04机器目标(我有一个虚拟机(尝试一下。一个想法是从arm64机器复制/lib/modules/5.4.0-77-generic/build目录,并将该文件夹用作交叉编译的-C选项。但我很快发现,这个"构建"目录是指向/usr/src/linux-headers-5.40-77-generic的符号链接,许多文件或目录也有指向/usr/src/linux-headers 5.4.0-77下的符号链接。所以我需要复制/lib/modules/5.4.0-77-generic、/usr/src/linux-headers-5.40-77和/usr/src/linx-headers-5.4.0-77-gneric。这似乎不太好。
所以我的问题是:在这种情况下,我应该如何提供-C选项(构建脚本所在的位置(?我可以在主机系统中安装linux-headers5.4.0-77和linux-headers 5.4.0-77-generic并使用它们吗?(我试过了,但我有一个编译错误:
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -C /lib/modules/5.4.0-77-generic/build M=/home/ckim/pprj/qemu_test/test_ldd modules
make[1]: Entering directory '/usr/src/linux-headers-5.4.0-77-generic'
CC [M] /home/ckim/pprj/qemu_test/test_ldd/chr_drv_ex1.o
In file included from ./include/linux/types.h:6,
from ./include/linux/limits.h:6,
from ./include/linux/kernel.h:7,
from /home/ckim/pprj/qemu_test/test_ldd/chr_drv_ex1.c:1:
./include/uapi/linux/types.h:5:10: fatal error: asm/types.h: No such file or directory
5 | #include <asm/types.h>
| ^~~~~~~~~~~~~
compilation terminated.
make[2]: *** [scripts/Makefile.build:271: /home/ckim/pprj/qemu_test/test_ldd/chr_drv_ex1.o] Error 1
make[1]: *** [Makefile:1762: /home/ckim/pprj/qemu_test/test_ldd] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-5.4.0-77-generic'
make: *** [Makefile:4: all] Error 2
@Tsyvarev在他的评论中告诉我,我实际上应该构建内核,-C
选项应该指向内核构建目录。以下是我所做的更多搜索。(谢谢@Tsyvarev!(
假设您所在的目录中有内核模块*.c源程序(此处为chr_drv_ex1.c(和Makefile,并且我已经从为其制作内核模块的虚拟机中复制了/boot/config-5.40-77-generic/u20_config。要获取当前运行的内核的.config文件,请参阅此处。
sudo apt install linux-source-5.4.0 (/usr/src/linux-source-5.4.0 is installed)
tar -xf /usr/src/linux-source-5.4.0/linux-source-5.4.0.tar.bz2
cd linux-source-5.4.0
cp ../u20_config .config (u20_config is from ubuntu-20.04 VM)
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j`nproc`
cd ..
make (this builds kernel module and app, see Makefile)
这就是我使用的Makefile(test_chr_drv是使用驱动程序的应用程序(。
export CROSS_COMPILE:=aarch64-none-linux-gnu-
export ARCH:=arm64
obj-m += chr_drv_ex1.o
export KDIR:=linux-source-5.4.0
all: test_chr_drv
make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KDIR) M=$(PWD) modules
clean:
make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KDIR) M=$(PWD) clean
rm -f test_chr_drv
test_chr_drv: test_chr_drv.c
$(CROSS_COMPILE)gcc $^ -o $@