ディストリビューションカーネルに問題があり、モジュールをビルドするためにカーネル(同じバージョン)をビルドしました。私のモジュールは互換性があります。ただし、モジュールをインストールすると、スクリプトはカーネルのモジュールディレクトリに書き込むのではなく、/lib/modules/に新しいディレクトリを作成します。次のように見えます。
/lib/modules/old_kernel
/lib/modules/new_kernel
/lib/modules/old_kernel/TARGET1のような固定パスに書き込む方法はありますか?これまでのインストールパスをオーバーライドすると、非常に奇妙な動作のみが発生します。例: /lib/modules/old_kernel/lib/modules/new_kernel/TARGET1
obj-m += rcio_core.o
obj-m += rcio_spi.o
obj-m += rcio_adc.o
obj-m += rcio_pwm.o
obj-m += rcio_rcin.o
obj-m += rcio_status.o
ccflags-y := -std=gnu99
KVERSION ?= $(shell uname -r)
KERNEL_SOURCE ?= /lib/modules/$(KVERSION)/build
all:
$(MAKE) -C $(KERNEL_SOURCE) M=$(PWD) modules
/usr/local/bin/dtc -@ -I dts -O dtb rcio-overlay.dts -o rcio-overlay.dtb
cp rcio-overlay.dtb /boot/overlays
install:
$(MAKE) -C $(KERNEL_SOURCE) M=$(PWD) modules_install
clean:
$(MAKE) -C $(KERNEL_SOURCE) M=$(PWD) clean
$(RM) rcio-overlay.dtb
答え1
このモジュールをインストールするために「make module_install」を使用するとします。 /lib/modules 以下のターゲットは、カーネルモジュールソースファイルを構築するカーネルヘッダに基づいて決定されます。 Fedoraでは、これらのヘッダーはkernel-develによって提供されます。したがって、「rpm -q kernel-devel」が/lib/modules(希望するバージョン)の下にカーネルバージョンを表示すると、すべてが正常です。そうでない場合は、このrpmをアンインストールして必要なバージョンでインストールし、モジュールをビルドしてインストールできます。他のディストリビューションではパッケージ名が異なる場合がありますが、同じ原則が適用されます。
ラミーローゼン
答え2
使用する makefile は次の行で表示されます。
KVERSION ?= $(shell uname -r)
特に、/lib/modules/$(KVERSION)/build/Makefile
実行中のすべてのターゲットは$(MAKE) -C
これを参照します。
これは一定でなければならず、ターゲットから手動で変更することはできません。これらのターゲットはclean
他のバージョンでもほぼ同じように機能しますが、特定のカーネルバージョン(Makefile)でカーネルモジュールをビルドすると、マジックナンバーが異なるため、他のバージョンにインストールすることはできません。同様に、modules_install
指すディレクトリを手動で変更することは意味がありません。
つまり、別のバージョンをターゲットにするには、KVERSION
変数が指すディレクトリにあるように変数を変更しますKERNEL_SOURCE
。
これは通常インストールされているカーネルの場合です。詳しくは@Rami Rosenの回答をご覧ください。しかし、あなたが行ったことに言及したので、編むkernel-devel
パッケージをインストールするのではなく、2回確認することをお勧めします(たとえば、カーネルバージョンのスペルがどうなるか)。