代码之家  ›  专栏  ›  技术社区  ›  Ludo

交叉编译内核模块(ARM)不执行任何操作

  •  1
  • Ludo  · 技术社区  · 8 年前

    不久前,我为ARMv7(Cortex-A5)开发了一个内核模块。这个模块工作得很好,但我需要为它添加一个功能。不幸的是,同时安装了交叉编译器工具链的机器被重新调整了用途,所以我不得不重新设置它。当然,我发现我没有记录所有的细节,我一直在努力获得一个可以实际加载的模块。大约一天后,我设法编译了一些被 insmod 在目标上。

    但是模块什么都不做。

    加载模块 没有给我任何错误。 dmesg 没有显示任何内容,尽管模块应该打印其探测例程中的一些信息。此外,它应该创建的角色设备不存在,显然模块的探测例程没有运行。

    如果我这样做了 modinfo 在旧的 .ko (我现在还有)和新的 .击倒取胜 ,没有区别。 file 也显示相同的输出,除了 sha1 校验和,预计为:

    module_old.ko: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), BuildID[sha1]=1f55850e8da4b3b5931536060d62193d94730cf6, not stripped
    module_new.ko: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), BuildID[sha1]=c3b1f6fdcb72381beb7b8a766c70af7a1252a78f, not stripped
    

    我看到的唯一区别是 .击倒取胜 大约比旧的大10倍:

    -rw-r--r-- 1 root root 154504 Apr 21 23:38 module_new.ko
    -rw-rw-r-- 1 root root  17956 Oct  4  2017 module_old.ko
    

    我的Makefile如下所示:

    obj-m += mymodule.o
    
    KERNEL_SOURCE_DIR = /home/ludo/linux-at91-linux4sam_5.3
    
    all:
            make -C $(KERNEL_SOURCE_DIR)  CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm M=$(PWD) modules
    
    clean:
            make -C $(KERNEL_SOURCE_DIR)  CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm M=$(PWD) clean
    

    我尝试添加

    CFLAGS_mymodule.o := -march=armv7-a -mtune=cortex-a5
    

    但这没有什么区别。

    我以DebianJessie(8.10)和GCC4.9为基础。我不记得我用什么GCC版本构建了旧版本,但它是4。x、 不更新。

    有什么办法可以调试这个问题吗?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Ludo    8 年前

    我忘了记录构建过程中一个非常重要的步骤。在构建模块之前,需要确保配置一致。这可以通过从内核源代码树的根执行:

    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- sama5_defconfig
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules
    

    然后就可以编译模块了,一切都很好。