2

我在这里有这个典型的要求:

内核/arch/arm/lib/csumpartial.S中有一个文件,它有一个名为的函数csumpartial(),它计算 16 位校验和(显然是汇编编码的),这个函数用 EXPORT 符号导出。

我现在已经使用名为 NEON 优化的内部函数实现了相同的函数,该函数位于名为csumpartial.c

我有以下要求:

  1. 现在我希望调用内核函数而不是程序集版本调用我的函数“csumpartial”版本。

    --为此,我应该用我的 csumpartial.C 文件替换 csumpartial.S 文件吗?但是那么如何更换(所有事情都需要照顾)?

  2. 此 csumpartial.c 文件应使用特殊编译器标志进行编译以-mfpu=neon -mfloat-abi=softfp -flax-vector-conversions -O3进行 NEON 优化。

    -- 那么在哪里以及如何提及这个编译器标志呢?

简而言之,汇编版本应该完全弃用,c 版本应该在编译-mfpu=neon -mfloat-abi=softfp -flax-vector-conversions -O3内核时使用标志编译。当内核有人调用时,应该调用该函数的 c 版本csumpartial

早期的帮助将不胜感激。

少量输入:

  1. Linux 版本 2.6.37
  2. 使用交叉编译器工具对 arm 进行交叉编译 (cgt_a8/arm-2009q1)
  3. ARM cortex-a8 编码

让我知道更多输入

注意:只有我会使用这个编辑过的内核,所以我理解这种替换所涉及的风险

4

2 回答 2

1

如果您只想构建一次修改后的内核 -使用命令行中所需的编译标志将您的csumpartial.c编译为csumpartial.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

我已经通过 hack 解决了这个问题,以下是我为使其正常工作所做的事情:

想出了两种替代方法来做到这一点:

  1. 替换为csumpartial.Sundercsumpartial.c并且arch/arm/lib/因为csumpartial.c包含 NEON 指令并且必须使用特殊的编译器标志进行编译,所以将此行添加到 Makefile:

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

    (在某些情况下,由于编译器标志与 neon 标志冲突,在编译期间这不应该工作)

    我们可以通过使用 Makefile 中的函数过滤掉冲突的编译器标志,filter-out但是我们会遇到另一个问题,过滤掉的标志也不能用于其他文件(因为我们只想为 csumpartial 文件否定编译标志,所以这将是一个问题)

    所以我想出了另一种方法(2)

  2. 非常清楚,我做了以下步骤:

    一种。删除 csumpartial.S 从arch/arm/lib

    湾。csumpartial.o从此文件夹下的 Makefile 中删除该条目

    C。neon在下新建一个文件夹arch/arm/lib

    d。在此处添加csumpartial.c文件还创建一个 Makefile 并将其添加到 Makefile

    拱/臂/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 回答