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

相关推荐
一枝小雨6 天前
ARM异常处理流程与中断机制总结,与常见丢中断情况
arm开发·嵌入式硬件·架构·系统架构·arm
亿道电子Emdoor8 天前
【ARM】MDK-解决中文注释的乱码问题
arm开发·stm32·单片机·arm·mdk
亿道电子Emdoor9 天前
【ARM】MDK-解决单机版LIC获取报错
arm开发·stm32·单片机·arm
Invinciblenuonuo13 天前
STM32八股【1】-----启动流程和startup文件理解
stm32·arm
亿道电子Emdoor1 个月前
【ARM】DS如何查看工程的堆栈使用情况
arm开发·stm32·单片机·arm
toradexsh1 个月前
ARM 处理器平台 eMMC Flash 存储磨损测试示例
linux·arm·nxp·toradex·emmc
CYRUS STUDIO1 个月前
使用 AndroidNativeEmu 调用 JNI 函数
android·汇编·arm开发·arm·逆向·jni
小虾米的Daddy2 个月前
ARM64 Trust Firmware [一]
linux·arm·安全架构
世事如云有卷舒2 个月前
《ARM64体系结构编程与实践》学习笔记(三)
笔记·学习·arm
亿道电子Emdoor2 个月前
【ARM】MDK烧录配置文件无权限访问
arm开发·stm32·单片机·arm