2

ここにこの典型的な要件があります:

カーネルには、 16 ビット チェックサム (明らかにアセンブリ コード) を計算する/arch/arm/lib/csumpartial.Sという名前の関数を持つファイルがあり、この関数は EXPORT シンボルでエクスポートされます。csumpartial()

という名前のファイルにある組み込み関数を使用して、NEON 最適化で同じ関数を実装しました。csumpartial.c

次の要件があります。

  1. ここで、関数 'csumpartial' のバージョンが、アセンブリ バージョンではなく、呼び出し側のカーネル関数によって呼び出されるようにします。

    -- これを実現するには、csumpartial.S ファイルを csumpartial.C ファイルに置き換える必要がありますか? しかし、その後、どのように交換するのですか (すべてのことを処理する必要があります)?

  2. この csumpartial.c ファイルは-mfpu=neon -mfloat-abi=softfp -flax-vector-conversions -O3、NEON 最適化用の特別なコンパイラ フラグを使用してコンパイルする必要があります。

    -- では、このコンパイラ フラグについて言及する場所と方法は?

-mfpu=neon -mfloat-abi=softfp -flax-vector-conversions -O3要するに、アセンブリ バージョンは完全に廃止されるべきであり、カーネルがコンパイルされている間、c バージョンはフラグ付きでコンパイルされるべきです。そして、カーネルの誰かが呼び出したときに、c バージョンの関数を呼び出す必要があります。csumpartial

早い段階で助けていただければ幸いです。

いくつかの入力:

  1. Linux バージョン 2.6.37
  2. クロス コンパイラ ツールを使用した arm のクロス コンパイル ( cgt_a8/arm-2009q1)
  3. ARM cortex-a8 のコーディング

その他の入力について教えてください

注: この編集されたカーネルを使用するのは私だけなので、そのような置き換えに伴うリスクを理解しています。

4

2 に答える 2

1

変更したカーネルを 1 回だけビルドする場合は、コマンド ラインから必要なコンパイル フラグを指定して、 csumpartial.ccsumpartial.oにコンパイルします。その後、カーネル全体をコンパイルします。GNU make は、より高いタイムスタンプを持つ.Sファイルを.oファイルに再コンパイルしません。

永続的な解決策: csumpartial.S を削除し、csumpartial.c を作成し、次の行を/arch/arm/lib/Makefileに追加します。

CFLAGS_csumpartial.o += -mfpu=neon -mfloat-abi=softfp -flax-vector-conversions -O3

# seems this line is not necessary
$(obj)/csumpartial.o: $(obj)/csumpartial.c
于 2013-01-20T20:22:04.470 に答える
1

これをハックで解決しました。これを機能させるために行ったことは次のとおりです。

これを行うための 2 つの代替方法を考え出しました。

  1. csumpartial.Scsumpartial.c以下arch/arm/lib/に置き換え、csumpartial.cNEON 命令が含まれているため、特別なコンパイラ フラグを使用してコンパイルする必要があるため、次の行を Makefile に追加します。

    CFLAGS_csumpartial.o += -mfpu=neon -mfloag-abi=softfp -mflax-vector-conversions -O3

    (場合によっては、コンパイル時にコンパイラ フラグがネオン フラグのフラグと競合するため、これは機能しないはずです)

    Makefile で関数を使用して、競合するコンパイラ フラグを除外できますが、除外されたフラグが他のファイルでも使用できないという別の問題が発生します ( csumpartial ファイルに対してのみfilter-outコンパイラ フラグを除外したいため)。 、これは問題になります)

    だから私は別の方法を考え出した (2)

  2. 非常に明確にするために、次の手順を実行しました。

    を。から csumpartial.S を削除します。arch/arm/lib

    b. csumpartial.oこのフォルダーの下の Makefile からエントリを削除します

    c. neonの下に新しいフォルダーを作成します。arch/arm/lib

    d. ここにファイルを追加しcsumpartial.cます Makefile も作成し、これを Makefile に追加します

    arch/arm/lib/neon/Makefile

    KBUILD_CFLAGS += -mfpu=neon -mfloat-abi=softfp -flax-vector-conversions -O3

    コンパイル時に競合するコンパイラ フラグを無効にするには、次の行を使用します。

    KBUILD_FLAGS := $(filter-out -compiler-flags-to-negate, $(KBUILD_FLAGS))

    lib-y := csumpartial.o

    e. 一番上のMakefileに、つまりarch/arm/Makefileこれを追加しますlibs-y+=arch/arm/lib/ arch/arm/lib/neon/

それは私のために働いた。

于 2013-01-21T06:39:53.387 に答える