![内核 3.0 的交叉编译向后移植](https://linux22.com/image/173928/%E5%86%85%E6%A0%B8%203.0%20%E7%9A%84%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%91%E5%90%91%E5%90%8E%E7%A7%BB%E6%A4%8D.png)
我正在尝试编译向后移植(我选择了最新的 [5.6.8-1] 版本)用于带有提供的工具链的 i.MX35 (armv6) 嵌入式 Linux 系统(arm-fsl-gnueabi-gcc 4.6.2,不能选择不同的编译器)和 BSP 内核(3.0,不幸的是,不同的内核不是一个选择)。
相关页面声称
每个向后移植版本都经过测试编译,可用于所有受支持的内核。最旧的版本是(当前)3.0。
所以我应该没问题,不过,正如下面所写,我确信他们没有针对 3.0 测试这个版本,因为如果没有手动干预,它根本无法针对该版本进行编译。
我已经[重新]构建了内核源代码树并遵循“交叉编译”下的说明用于树外向后移植构建。然后首先我通过 ,选择了menuconfig
一堆 USB WiFi 驱动程序,但由于编译错误,我删除并重新提取了 tarball 并做了(因为他们声称
据了解,用户可能不知道如何配置反向移植包,就像他们可能不知道如何配置 Linux 内核一样,因此提供了默认配置文件的捷径,可用于仅构建他们感兴趣的驱动程序/子系统。
)只是defconfig-mwifiex
为了确保我在配置中没有做任何错误的事情。是的,我就是这样一个无可救药的乐观主义者。
我不得不删除一些“不太向后移植”的函数,这些函数依赖于 3.0 中未找到的功能:
更改
__atomic_add_unless
为atomic_add_unless
在backport-include/linux/atomic.h
改为无条件调用,
debug_fs_create_xul
因为不存在;由于条件版本根据 的大小进行调度,即该平台上的 32 位,因此无论如何都不会调用后者。backport-include/linux/debugfs.h
debug_fs_create_x32
debug_fs_create_x64
unsigned long
注释掉了(从第 360 行开始)
netdev_upper_dev_link
中的内容backport-include/linux/netdevice.h
,因为它在 3.0 中不存在,而仅在某些后续版本中存在。无论如何只能被调用我没有编译的模块(实际上,由于基本内核配置,它甚至不会出现在 menuconfig 中)所以它是安全的。放置在
#ifdef CONFIG_PCI
的定义下,因为它调用/{依赖于} 一个使用相同变量进行编辑的pcie_find_root_port
链#ifdef
backport-include/linux/pci.h
#ifdef
因为它使用的结构成员位于相同的目录pm_runtime_active
下backport-include/linux/pm_runtime.h
CONFIG_PM_RUNTIME
#ifdef
#ifdef
edNETLINK_CB(in_skb).sk
访问compat/backport-genetlink.c
withLINUX_IS_VERSION_GEQ(3, 10, 0)
因为sk
结构成员仅在该版本中添加。
不幸的是,扩展net/wireless/trace.c
存在问题TP_PROTO
,因此 GCC 出现很多错误error: expected ')' before 'struct'
,而我没有设法解决这些问题。有任何想法吗?
如果没有,任何确实在3.0上测试过向后移植版本(希望有大量经过实战检验的 WiFi USB 驱动程序可用)?