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

相关推荐
徐某人..4 小时前
ARM嵌入式学习--第十天(UART)
arm开发·单片机·学习·arm
花花少年2 天前
【概念版】交叉编译相关介绍
arm·交叉编译
张琦-Q6 天前
ubuntu解决普通用户无法进入root
linux·ubuntu·arm
张一西14 天前
ARM学习(42)CortexM3/M4 MPU配置
stm32·arm·mpu·nxp·arm架构·cortexm3·cortexm4
CV金科19 天前
freertos的基础(二)内存管理:堆和栈
stm32·开源·arm·freertos·risc-v
代码改变世界ctw19 天前
Armv8/Armv9架构从入门到精通-介绍
arm·trustzone·atf·tee·armv8·armv9·周贺贺
Hi2024021722 天前
RK3588上CPU和GPU算力以及opencv resize的性能对比测试
linux·opencv·arm·gpu·opencl·算力测试·mali-gpu
阿隆ALong25 天前
亚矩阵云手机:跨境出海直播的全方位利器
大数据·服务器·网络安全·矩阵·云计算·arm·信息与通信
世事如云有卷舒1 个月前
《learn_the_architecture_-_trustzone_for_aarch64_102418_0101_03_en》学习笔记
arm
千千道1 个月前
linux的线程同步(条件变量和锁)
linux·arm开发·驱动开发·物联网·arm