./arch/arm/include/asm/barriers.h:33:24: error: operator '>=' has no left operand

本文介绍U-boot-2016.09移植到FS2416Board时出现的编译错误及其解决方法,主要原因是未正确配置CPU平台。

U-boot-2016.09移植到FS2416 Board(s3c2416 MPU)出错解决办法

问题Q:

  CC      lib/asm-offsets.s
In file included from ./arch/arm/include/asm/system.h:6:0,
                 from ./arch/arm/include/asm/cache.h:12,
                 from include/net.h:19,
                 from include/common.h:910,
                 from lib/asm-offsets.c:15:
./arch/arm/include/asm/barriers.h:33:24: error: operator '>=' has no left operand
 #if __LINUX_ARM_ARCH__ >= 7
                        ^
./arch/arm/include/asm/barriers.h:37:26: error: operator '==' has no left operand
 #elif __LINUX_ARM_ARCH__ == 6
                          ^
Kbuild:43: recipe for target 'lib/asm-offsets.s' failed
make[1]: *** [lib/asm-offsets.s] Error 1
Makefile:1277: recipe for target 'prepare0' failed
make: *** [prepare0] Error 2

解决方法A:

上面这个问题的产生是由于没有指定你所使用的CPU的平台,也就是没有CONFIG_SYS_CPU=xxxx,
而这个宏的定义在arch/arm/Kconfig 中

config TARGET_SMDK2410
    bool "Support smdk2410"
    select CPU_ARM920T

config TARGET_FS2416
    bool "Support fs2416"

因为在bool "Support fs2416"后面忘记添加了select CPU_ARM926EJS这句话,所以造成了上面的这个问题
写成这样,就解决了问题
config TARGET_SMDK2410
    bool "Support smdk2410"
    select CPU_ARM920T

config TARGET_FS2416
    bool "Support fs2416"
    select CPU_ARM926EJS 
<think>我们正在处理一个与Linux内核ARM64架构相关的编译错误。错误信息是:在文件`./arch/arm64/include/asm/atomic_ll_sc.h`的第298行出现了`unknown type name 'u128'`。这意味着编译器无法识别类型`u128`。 根据引用[1]中提到的内核栈配置,我们知道内核代码中会使用一些特定的类型和宏定义。但是,这里的错误是关于一个类型`u128`未定义。 ### 分析步骤: 1. **理解`u128`类型**:在内核中,`u128`通常表示一个128位的无符号整数类型。在ARM64架构中,128位整数的支持可能需要特定的编译器支持或内核配置。 2. **查找类型定义**:在内核源代码中,`u128`类型通常定义在头文件中。我们可以查找`u128`是在哪里定义的。 3. **检查依赖的头文件**:在`atomic_ll_sc.h`中,可能没有直接包含定义`u128`的头文件,因此我们需要手动包含。 4. **内核版本和配置**:不同的内核版本可能对128位整数的支持不同。此外,某些配置选项(如`CONFIG_ARCH_SUPPORTS_INT128`)可能会影响`u128`的可用性。 ### 解决方法: 通常,在内核中,128位类型是通过`<linux/types.h>`中的`__u128`或`__s128`来定义的,或者是通过编译器内置的`__uint128_t`。但是,这里使用的是`u128`,这可能是内核内部的一个typedef。 我们可以尝试以下步骤: #### 1. 包含必要的头文件 在`atomic_ll_sc.h`文件中,确保包含了定义`u128`的头文件。根据内核源码,`u128`类型通常在`<asm-generic/int-ll64.h>`中定义(通过`typedef __u128 u128;`)。但是,在ARM64架构中,可能是在`<asm/types.h>`中定义。 因此,在`atomic_ll_sc.h`的开头,尝试添加: ```c #include <linux/types.h> ``` 或者 ```c #include <asm/types.h> ``` #### 2. 检查配置选项 确保内核配置中启用了128位整数支持。在ARM64中,这通常需要编译器支持(GCC支持`__uint128_t`)并且内核配置选项`CONFIG_ARCH_SUPPORTS_INT128`被启用。 检查内核配置文件(.config)中是否有: ```makefile CONFIG_ARCH_SUPPORTS_INT128=y ``` #### 3. 编译器支持 确认使用的编译器是否支持128位整数。可以通过以下命令检查: ```bash echo 'int main(){ __uint128_t a; return 0; }' | gcc -x c - -o /dev/null ``` 如果返回0,则表示支持。 #### 4. 修改代码 如果头文件包含后问题仍然存在,可以尝试在`atomic_ll_sc.h`中直接定义`u128`(如果确认编译器支持): ```c #if defined(__SIZEOF_INT128__) && __SIZEOF_INT128__ == 16 typedef __uint128_t u128; #else #error "Compiler does not support 128-bit integers" #endif ``` 注意:直接修改内核头文件需要谨慎,最好通过官方内核补丁解决问题。 ### 实际建议: 根据错误出现的文件位置,我们可以查看该文件第298行附近的代码。通常,在内核的ARM64架构代码中,128位操作通常用于原子操作。实际上,在较新的内核版本中,`u128`类型可能已经在`<asm/types.h>`中定义,但可能由于头文件包含顺序问题导致未包含。 因此,在`./arch/arm64/include/asm/atomic_ll_sc.h`中,我们可以查看是否包含了`<asm/types.h>`或者`<linux/types.h>`。如果没有,则添加一个包含。 但是,请注意,内核头文件包含有严格的顺序,不能随意添加。所以,另一种做法是检查该头文件是否应该通过其他头文件间接包含,可能是某个依赖的宏没有定义,导致条件编译跳过了包含。 ### 总结步骤: 1. 打开`./arch/arm64/include/asm/atomic_ll_sc.h`文件,查看第298行附近的代码,确认`u128`的使用。 2. 检查该文件开头包含的头文件,看是否包含了`<asm/types.h>`或`<linux/types.h>`。如果没有,尝试在包含其他头文件之后加入`#include <linux/types.h>`。 3. 如果问题依旧,检查内核配置,确保`CONFIG_ARCH_SUPPORTS_INT128`被启用(通常ARM64是支持的)。 4. 如果编译器不支持128位整数,需要升级编译器或使用支持的内核版本。 ### 参考补丁: 在内核邮件列表中,曾有类似问题的补丁。例如,在2017年左右,ARM64的原子操作添加了128位支持,相关补丁可能修改了头文件包含。所以,如果是在旧内核版本上出现此问题,可以考虑升级内核或应用相关补丁。 ### 引用说明: 根据引用[1]中的内核栈配置,虽然与当前问题不直接相关,但提醒我们内核头文件可能因架构和配置不同而变化。引用[2]中的性能对比示例与当前问题无关。 因此,针对该错误,我们主要关注头文件包含和类型定义。 ### 相关问题: 1. 在内核编译过程中,如何调试未定义类型的错误? 2. ARM64架构中,原子操作如何使用128位整数? 3. 内核配置选项`CONFIG_ARCH_SUPPORTS_INT128`的作用是什么? </think>### 解决 `./arch/arm64/include/asm/atomic_ll_sc.h` 文件第 298 行 `unknown type name 'u128'` 错误的方法 该错误是由于编译器无法识别 `u128` 类型(128 位无符号整数)导致的。以下是系统性的解决方案: --- ### **1. 确认头文件包含关系**ARM64 架构中,`u128` 类型通常通过 `<linux/types.h>` 间接定义。检查文件 **`atomic_ll_sc.h`** 是否包含以下头文件: ```c #include <linux/types.h> // 定义基础类型(如 u8/u16/u32/u64) #include <asm-generic/int-ll64.h> // 定义 u128(若支持) ``` **修改建议**: 在 `atomic_ll_sc.h` 的开头显式添加缺失的头文件: ```c #include <linux/types.h> #include <asm/types.h> ``` --- ### **2. 验证编译器支持 128 位整数** `u128` 依赖编译器的 `__uint128_t` 支持。执行以下检查: ```bash # 检查编译器是否支持 128 位整数 echo 'int main(){ __uint128_t x; return 0; }' | gcc -x c - -o /dev/null ``` - **返回值 0**:支持(需配置内核启用) - **非 0**:需升级 GCC 至 4.6+ 版本或支持 ARMv8.1-A+ 的编译器 --- ### **3. 启用内核配置选项** 确保内核配置启用 128 位整数支持: ```bash # 检查内核配置 grep CONFIG_ARCH_SUPPORTS_INT128 .config # 若未启用,通过 menuconfig 激活 make menuconfig ``` 导航至: **Kernel Features****Enable support for 128-bit integers** (`CONFIG_ARCH_SUPPORTS_INT128=y`) --- ### **4. 修复类型定义(备用方案)** 若头文件未正确定义 `u128`,在 `atomic_ll_sc.h` 中添加类型强转: ```c // 修改前 u128 oldval = ...; // 修改后(显式使用编译器内置类型) __uint128_t oldval = ...; ``` 或在文件顶部添加类型重定义: ```c #if defined(__SIZEOF_INT128__) && __SIZEOF_INT128__ == 16 typedef __uint128_t u128; #endif ``` --- ### **5. 版本兼容性处理** - **旧内核版本**(< 5.2):`u128` 可能未完全支持,需升级内核或打补丁[^1]。 - **跨架构问题**:确认代码未错误引用 x86 头文件(ARM64 需用 `#ifdef CONFIG_ARM64` 隔离)。 --- ### **验证修复** 1. 清理编译缓存: ```bash make clean ``` 2. 重新编译: ```bash make -j$(nproc) ``` --- ### 根本原因分析 此错误通常由以下原因触发: 1. 头文件包含缺失(`<linux/types.h>` 未包含) 2. 内核配置未启用 `CONFIG_ARCH_SUPPORTS_INT128` 3. 编译器不支持 `__uint128_t` 4. 代码版本不兼容(如从 x86 移植ARM64 时遗漏适配) > 在实时系统中,数据类型的选择直接影响内存访问效率和原子操作可靠性。128 位整数适用于需要高精度原子计数(如加密算法),但需确保编译器和硬件支持[^2]。 --- ### 相关问题 1. 如何在 ARM64 架构下启用编译器对 128 位整数的支持? 2. 内核头文件 `linux/types.h` 和 `asm/types.h` 有何区别? 3. 实时系统中使用 128 位原子操作有哪些性能风险? [^1]: 参见内核文档:`Documentation/arm64/memory.rst` [^2]: 引用自实时系统数据结构性能优化指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值