newlibc memcpy 存在问题

背景

sdk 中发现 memcpy 函数没有达到预期,执行后,目的地址与源地址中的内容不一致。

复现方法

通过单步调试 memcpy 汇编代码,发现使用了 ldrh 指令,该指令在对 uncacheable memory 同时该 memory 非对齐的情况下,并不会按照预期执行(从内存 load 两字节到目标寄存器),如下汇编代码。

.text
.global my_memcpy
.type my_memcpy, %function
my_memcpy:
    push    {r10,lr}
    ldrh    r10, [r1]  # 如果 r1 不对齐且为 uncacheble,并不会 load 2 字节到 r10
    strh    r10, [r0]
    pop     {r10, pc}

.size my_memcpy, .-my_memcpy

关闭了非对齐访问检查,所以不会产生 fault

该指令执行结果,如图:

实锤

newlibc 中 memcpy 存在非对齐访问,某些 cpu (cortex-a5 与 cortex-a9)非对齐访问时,行为不一致,可参考 ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf 第 109 页。

对于非对齐访问(cpu 使能非对齐访问,SCTLR 寄存器的 bit1),会产生不可预测行为。

相关推荐
创龙科技-黄工20 分钟前
【深度剖析】自主可控的全国产方案,基于龙芯LS2K1000LA-i!
arm·龙芯·工业核心板·国产处理器
シ風箏1 天前
Neo4j【环境部署 02】图形数据库Neo4j在Linux系统ARM架构下的安装使用
linux·数据库·arm·neo4j
徐某人..4 天前
ARM嵌入式学习--第八天(PWM)
arm开发·学习·arm
徐某人..5 天前
ARM嵌入式学习--第七天(GPT)
学习·arm
whik11948 天前
Keil-MDK开发环境编译后axf自动转换bin格式文件
stm32·arm·keil·axi·bin·mdk
编程零零七10 天前
【Python】tensorflow中的argmax()函数
开发语言·python·信息可视化·数据分析·arm·python学习·python数据可视化
嵌入式小能手12 天前
shell编程入门之提取字符并设置rtc时间
linux·单片机·嵌入式硬件·arm
爱喝纯牛奶的柠檬16 天前
基于stm23的智慧宿舍系统 (DAY10)_小程序
stm32·嵌入式硬件·物联网·阿里云·小程序·arm
嵌入式小能手16 天前
自动化点亮LED灯之shell点灯
linux·单片机·嵌入式硬件·arm
白书宇22 天前
28.100ASK_T113-PRO Linux+QT 显示一张照片
linux·开发语言·arm开发·嵌入式硬件·qt·arm·硬件工程