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),会产生不可预测行为。

相关推荐
才鲸嵌入式15 天前
C++相比于C语言增加了哪些概念?
c语言·c++·单片机·嵌入式·arm·面向对象·软件
ID244251272016 天前
Linux设备框架:kset与kobject基本介绍
linux·c语言·arm开发·驱动开发·嵌入式硬件·linux内核·arm
hyh-hz18 天前
4 Studying《ARM System Developer’s Guide》9-15
arm
hyh-hz20 天前
1 Studying《Arm A715 Software Optimization Guide》
arm
飞凌嵌入式22 天前
基于RK3588,飞凌教育品牌推出嵌入式人工智能实验箱EDU-AIoT ELF 2
linux·人工智能·嵌入式硬件·arm·nxp
toradexsh1 个月前
HDMI 显示器热插拔对应显示应用启停测试
arm·nxp·hdmi·imx8qm·hotplug
才鲸嵌入式1 个月前
01 Ubuntu20.04下编译QEMU8.2.4,交叉编译32位ARM程序,运行ARM程序的方法
linux·c语言·单片机·嵌入式·arm·qemu·虚拟机
謓泽1 个月前
【STM32】按键控制LED & 光敏传感器控制蜂鸣器
stm32·单片机·arm
MaoXian_n1 个月前
[IMX] 08.RTC 时钟
linux·驱动开发·嵌入式硬件·arm
极术社区2 个月前
“星睿O6”AI PC 开发套件评测: NPU 算力测评(1)
arm