一个非对齐访问的问题

1、引言

  最近在编写代码时,出现了这样一个 bug。程序一跑,系统就崩溃了,报错是 bus error。

  目标平台:ARM32

  最终定位到出错的代码片段:

*((uint32_t *)ptr) = id;

这里的 ptr 是一个非 4 字节对齐的地址!!!

2、解决方法

  使用 Linux 下的 put_unaligned_le32接口,用于向非对齐(unaligned)内存地址写入一个 32 位小端(Little-Endian)数据。
  代码修改如下:

put_unaligned_le32(id, ptr);

put_unaligned_le32 函数实现如下:

#define __put_unaligned_t(type, val, ptr) do {						\struct { type x; } __packed * __put_pptr = (typeof(__put_pptr))(ptr);		\__put_pptr->x = (val);								\
} while (0)static inline void put_unaligned_le32(u32 val, void *p)
{__put_unaligned_t(__le32, cpu_to_le32(val), p);
}

逐句拆分讲解:

 struct { type x; } __packed * __put_pptr = (typeof(__put_pptr))(ptr);
  • __packed:__packed 是 GCC 的扩展,用于告诉编译器不要对结构体进行字节对齐,即使它打破对齐规则
  • typeof:是 GUN C 提供的一种特性,可以获取变量或者表达式的类型
  • 整体来说,使用到了 C 语言的匿名结构体
    • __packed 是修饰 struct 的
    • * 表示 __put_pptr 是一个指针,指向这个紧凑的结构体
    • (typeof(__put_pptr))(ptr),是一个类型转换(强制类型转换)

__put_pptr->x = (val);
  • 真正的数据写入操作。
  • 写入会在字节级别进行,而不会使用直接的内联 32 位或 64 位存储指令(LDR/STR)。

2.1 反汇编代码对比

对于以下代码:

*((uint32_t *)ptr) = id;

不使用 put_unaligned_le32 接口,对应的汇编:

 95d3480:	e8830006 	stm	r3, {r1, r2}

使用 put_unaligned_le32 接口,对应的汇编:

 95d3488:	e5431008 	strb	r1, [r3, #-8]95d348c:	e5432004 	strb	r2, [r3, #-4]

可以看到,从 STM 指令换成了 STRB 指令。

3、拓展知识

  处理器访存指令所发出的内存地址如果不是被访问的数据类型位宽的整数倍,称为非对齐访问。处理器访存指令支持字节访问(8bit),半字访问(16bit),字访问(32bit),双字访问(64bit)等,处理器的存储空间最小单位为字节,因此除了字节访问,其余访存指令均存在非对齐访问可能性。对于处理器硬件而言是否支持非对齐,如果出现非对齐访问时如何操作,需要有明确的规定。

  还是以 ARMV7 架构为例,从下面的图我们也可以看到,之前出现了非对齐访问异常,就是因为使用了 STM 指令。该指令必须要 Word 对齐,也就是 4 字节对齐。

  修改后的代码,使用了 STRB 指令进行字节访问,不需要对齐。

在这里插入图片描述

ARM® Architecture Reference Manual ARMv7-A and ARMv7-R edition

  关于处理器具体的字大小,
在这里插入图片描述

ARM® Architecture Reference Manual ARMv7-A and ARMv7-R edition

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/87314.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【构造】P8976 「DTOI-4」排列|普及+

本文涉及知识点 构造 P8976 「DTOI-4」排列 题目背景 Update on 2023.2.1:新增一组针对 yuanjiabao 的 Hack 数据,放置于 #21。 Update on 2023.2.2:新增一组针对 CourtesyWei 和 bizhidaojiaosha 的 Hack 数据,放置于 #22。…

多路I/O转接服务器(select、poll、epoll)

多路IO转接服务器也叫做多任务IO服务器。该类服务器实现的主旨思想是,不再由应用程序自己监视客户端连接,取而代之由内核替应用程序监视文件。 IO 多路转接方式比较: 常见的 IO 多路转接方式有:select、poll、epoll,他…

最新临时文件快传系统源码 轻量化 带后台

简介: 最新临时文件快传系统源码 轻量化 带后台 首发 轻松上传文件并生成提取码分享给他人,无需注册,方便快捷。 图片:

MyBatis多数据源动态连接工具类实现

这个DatabaseService工具类提供了动态创建MyBatis SqlSession的能力,可以灵活地连接到不同的数据库,非常适合需要动态切换数据源的场景。 package com.cmes.immp.device.utils;import lombok.SneakyThrows; import org.apache.commons.dbcp2.BasicDataS…

用亮数据 MCP 驱动 Trae 智能体:打造高效亚马逊商品采集与分析助手

本文适合希望快速构建数据驱动型智能体的开发者、数据工程师及 AI 产品设计者阅读 并非广告,希望本文可以帮助有需求的同学,祝大家天天开心 在数字时代,数据是决策与洞察趋势的关键。但移动互联网数据获取不易,传统爬虫技术面对复…

如何降低AIGC生成内容的重复率?五种免费降AI率的方法 (25年更新)

随着AI生成内容(AIGC)的普及,越来越多的学术写作依赖AI工具来生成论文和文章。然而,AI生成内容的查重率常常偏高,导致很多论文无法通过学术查重系统。为了解决这一问题,以下是五种有效的免费降AIGC率的方法…

小米YU7使用UWB技术,厘米级定位精准迎宾,安全防破解无感控车

当您双手抱着快递走向爱车时,车门自动解锁;当您站在前备箱前稍作停留,箱盖优雅升起——这不是科幻电影,而是小米YU7搭载UWB技术带来的真实体验。在2025年5月的小米15周年战略新品发布会上,雷军揭晓了这项革命性技术&am…

WPF学习(动画)

文章目录 一、图像变换 RenderTransform1、常见变换类型2、RenderTransform 的核心作用3、RenderTransform 的使用方式4、与 LayoutTransform 的对比5、在动画中的应用 二、 滚动的椭圆三、Storyboard放置位置1. **元素的 Resources 集合**2. **控件模板(ControlTem…

Crossbar结构的排队策略

目录 一、概述 二、排队策略 三、输入排队结构(IQ) 3.1 结构特点 3.2 改进方案 四、输出排队结构(OQ) 五、输入输出联合排队结构(CIOQ) 六、输入交叉节点联合排队结构(CICQ) 一、概述 Crossbar是一种全连接的交换结构,由 MN 个交叉…

状态模式 - Flutter中的状态变身术,让对象随“状态“自由切换行为!

订单状态流转/播放器控制/游戏角色行为…一个模式搞定所有状态驱动型逻辑! 经典场景:订单状态管理 假设你在开发一个外卖App,订单有以下状态: 等待接单已接单配送中已完成已取消 每个状态下: 显示的UI不同可执行的…

数据库9:数据库字符编码调整与校队(排序)规则

一.常用字符编码 1.ASCII编码 用一个字节表示一个字符 2.ANSI编码 每个国家为了显示本国的语言而对ASCII码进行了拓展 用两个字节表示一个汉字,中国的ANSI编码是GB2312编码(简体),日本的ANSI编码是JIS编码,台湾的A…

人脸活体识别4:Android实现人脸眨眼 张嘴 点头 摇头识别(可实时检测)

人脸活体识别4:Android实现人脸眨眼 张嘴 点头 摇头识别(可实时检测) 目录 人脸活体识别4:Android实现人脸眨眼 张嘴 点头 摇头识别(可实时检测) 1. 前言 2.人脸活体识别方法 (1)基于人脸动作的检测​​ (2&…

DAY1-Linux操作系统1

文章参考【黑马程序员Python教程_600集Python从入门到精通教程(懂中文就能学会)】 https://www.bilibili.com/video/BV1ex411x7Em/?p40&share_sourcecopy_web&vd_source263bbee2ddeb835c3ab6d9d3c80e0f7c 一.常用命令简单介绍 使用软件 虚拟机…

第十二节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - 两种权限控制方式(附前后端代码)

Vben5 系列文章目录 💻 基础篇 ✅ 第一节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 ✅ 第二节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - Python Flask 后端开发详解(附源码) ✅ 第三节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入…

华为云Flexus+DeepSeek征文 | 华为云 ModelArts Studio 赋能 AI 法务:合同审查与法律文件生成系统

一、引言 在法律行业数字化转型的浪潮中,AI 技术正重塑法律服务的流程与效率。本文介绍如何利用华为云 ModelArts Studio 构建一套完整的 AI 法务系统,实现合同审查、法律文件生成、法律咨询与风险识别的智能化解决方案。 二、系统架构设计 &#xff0…

SQL的底层逻辑解析

SQL的底层逻辑涉及数据库管理系统(DBMS)如何解析、优化和执行SQL查询,主要包括以下几个层面: ​查询处理流程​ 解析器(Parser):将SQL语句转换为语法树查询优化器(Optimizer):基于统计信息和成本模型生成最优执行计划执行引擎(Exe…

深入剖析AI大模型:PyTorch 技术详解

今天说一说PyTorch。作为一名python程序员,可能对它了解起来还是很快的。在人工智能浪潮席卷全球的当下,深度学习作为其核心技术,被广泛应用于图像识别、自然语言处理、语音识别等多个领域。而在深度学习的开发框架中,PyTorch 凭借…

物联网架构:定义、解释和实例

物联网(IoT)架构是一个复杂且多维度的概念,构成了物联网系统的核心框架。它是勾勒物联网设备、应用程序和技术如何相互交互以实现预期功能的蓝图。物联网架构并非 “一刀切” 的模型,而是会根据相关物联网系统的具体需求而有所不同…

拿到一台新服务器,怎么跑AI项目

公司新采购一台AI服务器,花大本钱装了个A6000显卡,今天来记录下新服务的使用步骤。 1、查看系统。 这台服务器预装了Ubuntu20.04系统。 lsb_release -a 查看下cpu、内存情况 top 看着还行。 再看下硬盘空间 df -h 空间不算小,2T。 2、…

IO--进程实操

1.创建一个进程扇 #include <051head.h> int main(int argc, const char *argv[]) {pid_t pid;for(int i0;i<4;i){pidfork();if(pid-1) //父进程{ERRLOG("fork error..\n");} else if(pid0) //这是子进程{ …