为什么我的内核模块 Makefile 使用内核 4.14 而不是 5.6 构建 .ko?

Why does my kernel module Makefile build a .ko with kernel 4.14 but not 5.6?

我有一个按照这个例子制作的 Makefile: cross compile kernel module

我从较旧的 Xilinx 源构建了一个 4.14 Linux 内核,然后使用该脚本构建了一个内核外模块,将其指向所述 4.14 内核源,并为我特定的平台架构。 那奏效了。 (它基于此代码,如果重要的话:dma-proxy.c

现在我需要一个更新的版本,并获得了内核名为 5.6.0-rc1 的 Xilinx 源代码。 (--branch "zynqmp-soc-for-v5.7" from here) 构建该内核也工作正常。 如果我现在对我的模块源代码和 Makefile 使用经过清理的干净目录(包括隐藏文件),指向较新的内核源代码,它既不会生成 .ko 文件也不会生成错误消息。 我得到的是:

make ARCH=arm64 CROSS_COMPILE="aarch64-linux-gnu-" -C /home/sk/src/XILINX/linux-xlnx SUBDIRS=/home/sk/src/XILINX/dma-proxy/driver modules
make[1]: Entering directory '/home/sk/src/XILINX/linux-xlnx'
CALL    scripts/checksyscalls.sh
CALL    scripts/atomic/check-atomics.sh
MODPOST 28 modules
make[1]: Leaving directory '/home/sk/src/XILINX/linux-xlnx'

我的文件夹中没有 .ko 文件,就像以前使用 4.14 构建时一样,并且它没有列出实际编译的任何内容。 我觉得很好奇它说 "MODPOST 28 modules",而将它指向内核 4.14,它应该说“1 个模块” 4.14 和 5.x 之间有什么变化会导致这种情况吗?

好的,这是我在问题中引用的教程建议的 makefile 模板:

PWD := $(shell pwd)
obj-m += hello.o

all:
        make ARCH=arm CROSS_COMPILE=$(CROSS) -C $(KERNEL) SUBDIRS=$(PWD) modules
clean:
        make -C $(KERNEL) SUBDIRS=$(PWD) clean

事实证明,如果我 SUBDIRS=$(PWD) 替换为 M=$(PWD),有效。现在,如果我 google 显式地针对 M 变量结合构建内核模块,我确实找到了以这种方式显示它的文本。但是网络上也充斥着使用 SUBDIRS 的示例,它对我来说适用于相当新的内核 (4.14)。

然后我确实找到了暗示这是一种旧方法的参考文献,比如 from here:

make -C $KDIR SUBDIRS=$PWD
    Same as M=. The SUBDIRS= syntax is kept for backwards compatibility.

事实上,这似乎真的很老,就像kernel 2.6.7 old。不幸的是,最近的教程显示了旧方法。