3

バージョン(android stock-kernel)の3.0.8+ mod_unload ARMv5カーネルで(自分で作成したカーネル)用にコンパイルされたローダブルカーネルモジュールを使用することは可能ですか?3.0.31-gd5a18e0 SMP preempt mod_unload ARMv7

モジュール自体にはほとんど何も含まれていません。

// Defining __KERNEL__ and MODULE allows us to access kernel-level code not usually available to userspace programs.
#undef __KERNEL__
#define __KERNEL__

#undef MODULE
#define MODULE

// Linux Kernel/LKM headers: module.h is needed by all modules and kernel.h is needed for KERN_INFO.
#include <linux/module.h>    // included for all kernel modules
#include <linux/kernel.h>    // included for KERN_INFO
#include <linux/init.h>        // included for __init and __exit macros

MODULE_AUTHOR("martin");
MODULE_LICENSE("GPL");

static int __init hello_init(void)
{
    //printk(KERN_INFO "Hello world!\n");
    return 0;    // Non-zero return means that the module couldn't be loaded.
}

static void __exit hello_cleanup(void)
{
    //printk(KERN_INFO "Cleaning up module.\n");
}

module_init(hello_init);
module_exit(hello_cleanup);

私はinsmodを強制していますが、カーネルがクラッシュします:

<1>[328.025360]仮想アドレス00000061でカーネルNULLポインターの逆参照を処理できません<1>[328.025695]pgd = c1be8000 <1> [328.025848] [00000061] * pgd = 00000000 <0> [328.026184]内部エラー:おっと: 5 [#1] PREEMPT SMP <4> [328.026519]リンクされているモジュール:airstream_interceptor(+)

私が使う

CROSS_COMPILE=/home/adminuser/WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-
KDIR    ?= /home/adminuser/WORKING_DIRECTORY/android-3.0
ARCH=arm

カーネルの構築とモジュールの構築の両方に。ただし、挿入する必要があるシステムは、独自のファクトリカーネルを使用します。

いくつかのAndroidフォン(arm、armv5、armv7など)で使用できるカーネルモジュールを構築しようとしていますが、すべてに1を使用したいと思います(これが可能であれば)。

(編集)

結論#1

  1. すべてのARMデバイスに対して1つのバージョンをコンパイルできないようにする必要があります。

    compile LKM for kernel 3.0.8 for ARMv5 and use it on a kernel 3.0.39 ARMv7

  2. 最も低いレベル(ARMv5)でコンパイルし、より高いレベル(ARMv6、ARMv7)で使用することが可能である可能性があります(現時点ではテストされていません!)。

    compile LKM for kernel 3.0.8 for ARMv5 and use it on a kernel 3.0.8 ARMv7

  3. カーネルバージョンを交換できる可能性があります(おそらく単純なLKMの場合)

    compile LKM for kernel 3.0.8 for ARMv5 and use it on a kernel 3.0.39 ARMv5

現時点で未解決の質問:

1.)

(common-kernel3.0.8およびomap-kernel3.0.39を使用して)ARMv7用にビルドしようとしましたが、結果は常にARMv5-LKMになります。

.configを手動で編集し、ARMv5行を削除し、ARMv7行を追加しました(これは.configのどこにもありませんでした)。

#CONFIG_CPU_32v5=y # I added the #
CONFIG_CPU_V7=y # didn't exist 
CONFIG_CPU_32v7=y # didn't exist 

しかし、カーネルソースで「make」を再実行すると、ファイルは自動的に編集され、v7-configが削除されます。数ヶ月前、これは問題なかったのを覚えています。2行追加しただけでうまくいきました。

これはカーネルソースのものですか、それとも使用されているツールチェーンですか?

2.)

LKM構築の観点から、たとえば「omap-kernel」と「common-kernel」の違いは何ですか?他のカーネルバージョン(たとえば、common-kernelには3.0.53とomap-kernel 3.0.39があります)?特定のバリアントを「無視」して、LKMコンパイルに共通カーネルを使用できると思いますか?

現時点では、アルカリ性、auselen、Markoに感謝します。あなたは、泥の中から私を助けてくれます。

4

2 に答える 2

3

異なるバージョンの Linux で同じバイナリ ドライバーを使用することはできません。

Linux にはバイナリ カーネル インターフェイスがなく、安定したカーネル インターフェイスもありません。(ソース

于 2013-01-09T19:12:34.450 に答える
1

いいえ、これは不可能です。Linuxカーネルはアーキテクチャ固有であり、ARMv5モジュールはARMv7と互換性がありません。必要なヘッダーファイルはさまざまです。これらのファイルには、さまざまな命令セット、レジスタマッピング、または任意の数の重要なバリアントが含まれます。

いずれにせよ、この場合もカーネルのバージョンが異なります。つまり、カーネルAPIが異なる可能性があるため、アーキテクチャが同じであっても、カーネルモジュールはおそらく機能しません。

カーネルモジュールの個別のバージョンをクロスコンパイルする必要があります。カーネルツリー全体にアクセスできる場合、これはそれほど難しくありません。製造業者は(GPLに従って)カーネルソースをリリースしているはずです。そうでない場合、彼らはあなたに情報源を借りています。

カーネル・モジュールのロードの詳細を読むことに興味がある場合は、IBMに優れた「解剖学」シリーズの記事があります。ロード可能なカーネルモジュールについて説明します。「モジュールのロードの詳細」のセクションにジャンプして、強制ロードがない場合にカーネルがモジュールの挿入を拒否する理由を理解してください。

于 2013-01-09T16:13:32.673 に答える