2

Android JellyBean で単純なカーネル モジュールを構築しようとしています。

コード:

#include <linux/module.h>  /* Needed by all modules */
#include <linux/kernel.h>  /* Needed for KERN_ALERT */

MODULE_LICENSE("GPL");
MODULE_AUTHOR("test");
MODULE_DESCRIPTION("Android ko test");

int init_module(void)
{
   printk(KERN_ALERT, "Hello world\n");

   // A non 0 return means init_module failed; module can't be loaded.
   return 0;
}

void cleanup_module(void)
{
  printk(KERN_ALERT "Goodbye world 1.\n");
}

メイクファイル:

obj-m +=hello.o

KERNELDIR ?= ~/android/kernel
PWD := $(shell pwd)
CROSS_COMPILE=~/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-
ARCH=arm

default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) modules

clean:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) clean

出力:

make -C ~/android/kernel M=/home/test/testmod ARCH=arm CROSS_COMPILE=~/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- modules
make[1]: Entering directory `/home/test/android/kernel'

  ERROR: Kernel configuration is invalid.
         include/generated/autoconf.h or include/config/auto.conf are missing.
         Run 'make oldconfig && make prepare' on kernel src to fix it.


  WARNING: Symbol version dump /home/test/android/kernel/Module.symvers
           is missing; modules will have no dependencies and modversions.

  CC [M]  /home/test/testmod/hello.o
In file included from <command-line>:0:
/home/test/android/kernel/include/linux/kconfig.h:4:32: error: generated/autoconf.h: No such file or directory
In file included from /home/test/android/kernel/arch/arm/include/asm/types.h:4,
                 from include/linux/types.h:4,
                 from include/linux/list.h:4,
                 from include/linux/module.h:9,
                 from /home/test/testmod/hello.c:1:
include/asm-generic/int-ll64.h:11:29: error: asm/bitsperlong.h: No such file or directory
In file included from /home/test/android/kernel/arch/arm/include/asm/posix_types.h:38,
                 from include/linux/posix_types.h:47,
                 from include/linux/types.h:17,
                 from include/linux/list.h:4,
                 from include/linux/module.h:9,
                 from /home/test/testmod/hello.c:1:
include/asm-generic/posix_types.h:70:5: warning: "__BITS_PER_LONG" is not defined
error, forbidden warning: posix_types.h:70
make[2]: *** [/home/test/testmod/hello.o] Error 1
make[1]: *** [_module_/home/test/testmod] Error 2
make[1]: Leaving directory `/home/test/android/kernel'
make: *** [default] Error 2

出力の提案に従い、カーネルで「make oldconfig && make prepare」を実行すると、多数のカーネル構成の「はい/いいえ」の質問が表示されます。その後、bitsperlong.h に関する次のエラーでコンパイルが失敗します。

4

3 に答える 3

5

Android は出力バイナリを out ディレクトリに配置します。したがって、たとえばout/target/product/<target name>/obj/KERNEL_OBJ/orが定義されている$ANDROID_PRODUCT_OUT/obj/KERNEL_OBJ/場合があります。$ANDROID_PRODUCT_OUTこのディレクトリは、ベンダーによって名前が異なる場合がありますが、単純にvmlinux.

そのため、Android リポジトリでカーネル モジュールをコンパイルする場合はmake、モジュールのディレクトリ内で次のようなコマンドを送信する必要があります。

make -C $ANDROID_PRODUCT_OUT/obj/KERNEL_OBJ/ M=`pwd` ARCH=arm CROSS_COMPILE=arm-eabi- modules
于 2013-01-28T15:19:44.987 に答える
2

モジュールの作成は、カーネルを少なくとも 1 回コンパイルした後に行う必要があります。カーネルをコンパイルしていないため、Module.symvers がありません。コンパイル中に、asm/bitsperlong.h などの特定のヘッダー ファイルが作成されます。

于 2013-01-27T04:28:53.290 に答える
1

最初に、指定されたパスでカーネルをコンパイルしたことを確認してください。あれは

" /home/test/android/kernel" but you are using 
" /home/android/kernel "     during compilation of module
KERNELDIR ?= ~/android/kernel has to be KERNELDIR ?= ~/test/android/kernel

そうでない場合は、~/android/kernelディレクトリで以下のコマンドを実行してカーネルをコンパイルします。

make ARCH=arm CROSS_COMPILE=~/test/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi

カーネルがコンパイルされると、カーネルの System.map ファイルで定義されたこの "__BITS_PER_LONG" 変数が取得されます。

~/test/android/kernel/System.map

この後、ハードルなしでモジュールをコンパイルできます

于 2013-01-22T17:37:41.747 に答える