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

相关推荐
myy-learn2 小时前
ARM-知识扫盲1
arm
祖力5510 小时前
ARM基础
嵌入式硬件·arm
下辈子不要当码农10 小时前
ARM学习(1)
学习·arm
一直C13 小时前
ARM入门学习Day01|ARM体系架构核心知识点梳理
arm·寄存器
T1mzhou1 天前
ARM64 Linux 6.10 内核驱动(12):dd.c:probe/ remove、延迟 probe
linux·服务器·c语言·arm开发·arm
T1mzhou1 天前
ARM64 平台安全学习记录
linux·服务器·arm开发·arm
zhangzhangkeji1 天前
stm32 3-4 : 按键控制 LED,光敏传感器控制蜂鸣器
stm32·arm
zhangzhangkeji3 天前
stm32 ,3-2:led 闪烁、流水灯、蜂鸣器
stm32·arm
zhangzhangkeji3 天前
stm32 笔记 - 3-1:GPIO 输出
stm32·arm
零依赖极客3 天前
Day 6·1 ARMv8.2 dotprod——vdotq_s32 一条指令做 4 个点积
c语言·开发语言·人工智能·矩阵·arm·vllm