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

相关推荐
佛祖保佑永不宕机1 天前
麒麟系统ARM64架构部署mysql、jdk和java项目
java·arm
CloudPilotAI3 天前
“海外滴滴”Uber的Arm迁移实录:重构大规模基础设施
arm开发·架构·arm
toradexsh7 天前
NXP iMX8MP ARM 平台多屏幕克隆显示测试
linux·arm·nxp·toradex·imx8mp
二年级程序员12 天前
ARM介绍及其体系结构
嵌入式硬件·arm
单车少年ing18 天前
linux两个特殊的宏 _RET_IP_ 和_THIS_IP_ 实现
linux·arm
大新新大浩浩22 天前
arm64适配系列文章-第六章-arm64环境上rabbitmq-management的部署,构建cluster-operator
rabbitmq·arm
大新新大浩浩22 天前
arm64适配系列文章-第九章-arm64环境上sentinel的部署
arm
大新新大浩浩22 天前
arm64适配系列文章-第三章-arm64环境上mariadb的部署
数据库·arm·mariadb
Zenexus1 个月前
Linux学习笔记协议篇(六):SPI FLASH设备驱动
linux·笔记·arm
Psyduck_ing1 个月前
探秘STM32如何成为现代科技的隐形引擎
stm32·单片机·arm