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

相关推荐
冷凝雨2 天前
【复旦微FM33 MCU 外设开发指南】外设篇1——硬件除法器
arm·1024程序员节·复旦微·fm33·fm33lc0
嵌入式小能手3 天前
串口通讯编程示例之开发板测试
linux·嵌入式硬件·arm
初级代码游戏7 天前
折腾记:arm上的mono和.net
.net·arm·mono
千千道10 天前
I.MX6U 之实时时钟(RTC)详解
arm开发·单片机·物联网·arm
程序员老刘·12 天前
Flutter开发的树莓派应用如何优化性能?
flutter·ubuntu·性能优化·arm
Tronlongtech12 天前
人工智能教学实验箱_国产处理器:5-29 语音识别控制实验
人工智能·arm·rk3568·实验室·实验箱
EINT12 天前
armv7-a mmu 配置
arm
程序员JerrySUN13 天前
U-Boot工程
linux·嵌入式硬件·物联网·系统架构·arm·开源软件·gnu
Tronlongtech14 天前
国产人工智能教学实验箱操作案例分享:5-27 指纹识别实验
数据库·人工智能·arm
Brinmon15 天前
BUU刷题-Pwn-codegate2018_melong(ARM的ret2libc)
arm开发·arm·pwn·ctf