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

相关推荐
大聪明-PLUS6 小时前
优雅的操作系统开发:用现代 C++ 编写操作系统内核(不使用宏)。第一部分——HAL 为王。
linux·嵌入式·arm·smarc
才鲸嵌入式1 天前
香山CPU(国产开源)的 SoC SDK底层程序编写,以及其它开源SoC芯片介绍
c语言·单片机·嵌入式·arm·cpu·verilog·fpga
大聪明-PLUS2 天前
硬件断点:它们在 Linux 中的用途和工作原理
linux·嵌入式·arm·smarc
大聪明-PLUS3 天前
如何修补 Linux 内核:完整指南
linux·嵌入式·arm·smarc
大聪明-PLUS3 天前
Docker 内部机制:深入剖析
linux·嵌入式·arm·smarc
大聪明-PLUS3 天前
常见的 Docker 问题及解决方法
linux·嵌入式·arm·smarc
___波子 Pro Max.3 天前
ARMv8-M架构IPSR寄存器读取函数解析
arm
大聪明-PLUS5 天前
Linux 系统中的电池衰减
linux·嵌入式·arm·smarc
俊俊谢5 天前
华大HC32F460配置JTAG调试引脚为普通GPIO(PB03、PA15等)
嵌入式硬件·嵌入式·arm·嵌入式软件·hc32f460
ONLYOFFICE5 天前
如何在Windows ARM64 上安装ONLYOFFICE桌面编辑器:完整指南
编辑器·arm·onlyoffice