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

相关推荐
zhangzhangkeji9 小时前
笔记 28 : linux 里 Kconfig 语法详解
arm
zhangzhangkeji1 天前
笔记 25 - 1 :linux 驱动模块移植,obj-y、obj-m,命令 dmesg,开启已有的硬件驱动
arm
zhangzhangkeji1 天前
笔记 25 - 2 :linux 驱动模块移植,创建自定义驱动(编译为模块),调整 shell 里字体大小,
arm
zhangzhangkeji2 天前
笔记 24 -2 :linux 内核编译,实验举例,及编译脚本
arm
zhangzhangkeji2 天前
笔记 23 :linux 内核基础知识,内核的目录
arm
抓不住时间的沙2 天前
N1搭建Hexo个人博客,部署到Github
python·docker·node.js·debian·github·arm
躺不平的理查德3 天前
ARCH与交叉编译器的关系
服务器·arm
奔跑的架构师5 天前
[A-49]ARMv9/v8-PSCI接口规范与工作流程简介
android·linux·arm开发·arm
zhangzhangkeji7 天前
笔记 22 - 5a :彭老师 15章,uboot 启动,linux 挂载 nfs 文件系统,组网与启动 NFS 服务
arm
zhangzhangkeji8 天前
笔记 22 - 4a :彭老师 15章,uboot 启动,zynq zturn ,uboot 启动参数分析;QSPI 操作
arm