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

相关推荐
切糕师学AI2 天前
位带操作(Bit-Banding)是什么?
c语言·arm·嵌入式开发·cortex-m·位带操作
普中科技3 天前
【普中STM32F1xx开发攻略--标准库版】-- 第 17 章 STM32 中断系统
stm32·单片机·嵌入式硬件·arm·中断系统·普中科技
kk哥88996 天前
Keil MDK 5.39 编程 + 调试 ,ARM 嵌入式开发!如何安装
c++·arm
CinzWS7 天前
Cortex-R52+ 架构深度解析与国产芯片实战
arm·exception·coretex-r52+·aarch32
大聪明-PLUS8 天前
编程语言保证是安全软件开发的基础
linux·嵌入式·arm·smarc
大聪明-PLUS9 天前
在 Linux 上使用实时调度策略运行应用程序
linux·嵌入式·arm·smarc
xc丶卡卡9 天前
麒麟ARM64安装达梦数据库
linux·运维·服务器·arm·达梦
大聪明-PLUS10 天前
Linux 系统中的 CPU。文章 2:平均负载
linux·嵌入式·arm·smarc
大聪明-PLUS12 天前
Linux 中的 CPU。文章 1. 利用率
linux·嵌入式·arm·smarc
大聪明-PLUS13 天前
Rsync:管理员详细指南 第2部分
linux·嵌入式·arm·smarc