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

相关推荐
惶了个恐14 小时前
嵌入式硬件第九弹——ARM(5)
arm开发·单片机·嵌入式硬件·arm·硬件工程
惶了个恐6 天前
嵌入式硬件第七弹——ARM(4)
arm开发·stm32·单片机·嵌入式硬件·arm·硬件工程
誰能久伴不乏7 天前
给开发板装上嘴巴与耳朵:i.MX6ULL 裸机串口 (UART) 驱动终极指南
arm开发·c++·单片机·嵌入式硬件·arm
惶了个恐9 天前
嵌入式硬件第六弹——ARM(3)
arm开发·stm32·嵌入式硬件·arm
嵌入小生00710 天前
ARM --- 基础知识汇总
linux·嵌入式·arm·指令集
徐某人..11 天前
基于i.MX6ULL开发板与OV5640摄像头实现QT相机应用开发
qt·学习·arm
REDcker11 天前
ARMv8、AArch64 与 arm64:命名与体系结构要点
开发语言·c++·arm
谷公子的藏经阁13 天前
聊点老古董: Arm Cortex-M v6/v7架构及其CPU
arm·cpu·armv7·cortex-m·armv6
蜕变的小白14 天前
嵌入式硬件的学习----ARM
arm开发·嵌入式硬件·学习·arm
老师用之于民15 天前
【DAY30】ARM 架构核心技术详解
汇编·arm