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

相关推荐
大聪明-PLUS20 小时前
TCP/IP 协议族—理论与实践(一)
linux·嵌入式·arm·smarc
大聪明-PLUS1 天前
TCP/IP 协议族—理论与实践(二)
linux·嵌入式·arm·smarc
openHiTLS密码开源社区2 天前
ARMv9 CCA机密计算架构演进技术解析:重塑云原生时代的数据安全基石
云计算·arm·trustzone·realm·cca·机密计算·tee/ree
酷飞飞3 天前
掌握DMA基于GD32F407VE的天空星的配置
stm32·单片机·嵌入式硬件·arm
大聪明-PLUS5 天前
如何从 USB 闪存驱动器安装 Debian Linux
linux·嵌入式·arm·smarc
一枝小雨8 天前
FreeRTOS下STM32双缓冲ADC数据采集与处理
stm32·单片机·dma·嵌入式·arm·freertos·adc
大聪明-PLUS9 天前
从技术史看:Unix 从何而来
linux·嵌入式·arm·smarc
硬汉嵌入式11 天前
ARM Cortex-X 与 Cortex-A 命名正式退役,推出C1 CPU和G1 GPU
arm·cortex
一枝小雨11 天前
STM32启动流程解析:从BootROM到BootLoader
stm32·单片机·嵌入式·arm·bootloader·boot rom
硬汉嵌入式11 天前
瑞萨M85内核芯片再出1GHz旗舰双核新品RA8T2,两个千兆以太网MAC,集成EtherCAT从机接口,面向高端电机控制
arm·瑞萨·ethercat·双核·cortex-m85