2011-02-01 6 views
4

私はアンドロイド用に動的に読み込まれたカーネルモジュールを作りたいと思っています。 私はLinuxをインストールしたくない、私はちょうどcygwinとアンドロイドNDKを持っている。アンドロイドNDKはカーネルモジュールのソースをコンパイルできますか?

+0

linuxにはカーネルABIがないので、個々のカーネルごとにモジュールをコンパイルする必要があります。 。 – lovespring

+0

ルートコールの電話機のアプリケーションからLKMをロードして、システムコールを干渉させることができます。何か案は? – DroidBot

答えて

1

ちょうど今、ユーザーがLKMを読み込もうとしていて、Android(Kernel core:2.6.29)上で成功していて、CygwinではなくLinux上にあったと思います。あなたもそれを得ることを願っています!

もう1つのリソースherehere too!があります。

すべてベスト!

0

このURLに従うと、Androidの開発者はcygwinよりもこのために仮想Ubuntuイメージを使用することを提案しています。

+0

いいえ、私はアンドロイドをコンパイルするのではなく、ちょうど新しいカーネルモジュールをコンパイルします。 – lovespring

+0

申し訳ありませんが、これまでのところこのような要件を満たしていません。私はソース全体を持っていたので、それぞれのドライバフォルダに自分のモジュールを追加してカスタムのアンドロイドイメージを取得しました。 – TheCottonSilk

3

はい、NDKを使用してカーネルモジュールを構築することは可能です。これは大文字と小文字を区別するファイルシステム(WindowsとMacシステムではデフォルトで提供されるものなど)でカーネルコードをクロスコンパイルするのが難しいため、Linuxシステム(Linux x86_64はサポートされている環境であると言われています)なぜなら、カーネルモジュールを構築するには、通常はLinux上にのみ存在するELFヘッダを必要とするELF操作バイナリ(modpost)を構築する必要があるからです。 それは...

まず、ソースコードをデバイスの同じ正確なカーネルに取得し、設定がデバイスと同じであることを確認する必要があります。 (そうでなければ、ビルドシステムを混乱させる可能性があります)

次に、Android NDKのクロスコンパイラツールチェーンがどこにあるかを判断する必要があります。ここで私は私の見つけ方法は次のとおりです。

サード(Iは、Android NDKをインストールした場所$NDK_HOMEは、ノート)

$ cd $NDK_HOME 
$ find . | grep '\-gcc$' 
./toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin/arm-eabi-gcc 
./toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc 

を、あなたは$NDK_HOME/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/binディレクトリを追加する必要があります(またはそれはあなたのシステム上にある場所)をPATHに環境変数。

その後、あなたは2つの環境変数をエクスポートする必要があります。

export ARCH=arm 
export CROSS_COMPILE=arm-eabi- 

(ノート、arm-eabi-プレフィックスは、我々はfindコマンドで見たものと同じであるカーネルが構築されている場合は、そのようgccldとしてコマンド。あなたがx86プラットフォーム用にビルドしていたのであれば、それらを調整しなければならないことに注意してください)。

次に、カーネルをコンパイルする必要があります。 (これを行うには、私はAndroidデバイスから/proc/config.gzを取り出し、カーネルのソースディレクトリ内でzcat config.gz > .configを実行した後、make menuconfig && makeを実行しました。)カーネルビルドのGurusはここでいくつかのショートカットを知っているかもしれませんが、カーネルソースディレクトリを正しく設定できませんでした実際のビルドを行わずにモジュールを構築するためのものです。 (あなたのビルドツリーのカーネルがあなたのデバイスに合っていれば、実際にカーネルを更新する必要はありません)。

最後に、普通のプロセスを使ってソースからカーネルモジュールをビルドしました。通常、カーネルモジュールにはパラメータ化されたビルドがあり、カーネルのソースツリーディレクトリに何とか読み込んでビルドを呼び出します。その時点で、カーネルソースツリーが正しく設定され、ARCHCROSS_COMPILEが設定されている限り、モジュールはビルドする必要があります。

これで幸いです。私はいくつかのデバイスごとの違いがあると確信しています。

関連する問題