chapter7——处理字节顺序

news2024/12/23 3:13:27

目录

  • 1.定义
  • 2.小端模式和大端模式的比较
  • 3.处理字节顺序不匹配的问题
  • 4.访问32位存储器
  • 5.处理字节顺序不匹配
  • 6.字节顺序中性代码
  • 7.字节顺序中性编码指南

1.定义

字节顺序定义数据在计算机系统中的存储格式。它描述存储器中地址的最高有效位(MSB)和最低有效位(LSB)的位置。对于数据始终以32位形式保存在系统存储器中的真正32位系统,字节顺序没什么实际意义,但是对于要将字节或16位半字映射到系统存储器中32位字的系统,字节顺序不匹配就会影响数据完整性。

字节顺序结构有两种类型,大端模式(Big Endian, BE)和小端模式(Little Endian, LE)。大端模式将MSB保存在最低存储器地址处,小端模式将LSB保存在最低存储器地址处。多字节数据的最低存储器可以认为是数据的起始地址。
下表是分别按大端模式和小端模式保存在存储器中的32位十六进制数0xAABBCCDD。字节0表示最低存储器地址。

在这里插入图片描述

在按原生数据类型(如32位)引用数据时,两种字节顺序所存储的多字节数据域是相同的。但在按字节或半字类型访问数据时,字域次序与系统的字节顺序配置相关。

在以半字方式处理时,存储器地址必须是2的倍数。

2.小端模式和大端模式的比较

  • 在小端模式中,因为最低位字节偏移值为0,并首先访问,访问1、2、4或更长字节数的汇编语言指令能按同样方式处理所有格式。同样,由于地址偏移量和字节数之间1:1的关系(偏移0对应字节0),多精度的数学程序也相对容易编写。
  • 在大端模式中,因为先访问高阶字节,所以很容易通过查看偏移量为0的字节来判断数值的正负。所以无须接收所有字节包就能知道符号信息。由于数字同时也以其打印出来的次序保存,所以对从二进制转化为十进制的程序特别有效。

大多数嵌入式通信处理器和定制解决方案在数据层采用大端模式(PowerPC,SPARC等)。因为为这些处理器所写的老程序通常遵循网络字节顺序(大端模式)。

某些CPU可以通过设置处理器寄存器而在大端或小端模式(双字节顺序)间切换。

3.处理字节顺序不匹配的问题

  • 在单个系统中字节顺序不会产生什么问题。只有在两台电脑通信时它才会产生影响。每个处理器和每种通信协议必须选择一种字节顺序。因此,如果需要通过存储器通信,两种不同字节顺序类型的处理器就会产生冲突。类似地,小端模式处理器在试图访问大端模式网络时需要用软件对字节重新排序。如果计算机无意间从共享存储区域或文件中读取以相反格式写入的二进制数据时,字节顺序的差异就会导致问题。
  • 另一个字节顺序会导致问题的领域是网络通信。由于在同一网络中可能存在不同类型(大端模式或小端模式)的处理器,它们之间必须彼此通信。因此网络协议栈和通信协议也必须定义字节顺序。否则,不同字节顺序的两个节点可能无法通信。
    在实际应用中,TCP/IP族中的所有协议层都定义为大端模式。也就是说,各层头中的16或32位值(如IP地址、包长度或校验和)必须首先发送或接收最高有效字节。TCP/IP协议所使用的多字节整数表达方式有时称为网络字节顺序。即使各终端计算机都是小端模式的,它们之间所传输的数据必须在通过网络前先转化为网络字节顺序,然后在接收端再转化为小端模式。

4.访问32位存储器

  • 字节地址和32位数据总线上特定位的关系如下所示:
    在这里插入图片描述
  • 下表为按8位、16位和32位访问大端与小端模式系统时的数据字节映射。
    在这里插入图片描述
    在这里插入图片描述

5.处理字节顺序不匹配

在包含若干IP的SOC中必然会发生字节顺序不匹配的问题,几乎所有第三方公司的IP都支持与处理器同样的字节顺序类型。处理字节顺序不匹配问题的最简单方法是为系统选择一种字节顺序类型(即,小端模式或大端模式),并将全部其他不同字节顺序的模块转化为目标字节顺序类型。

典型的字节顺序类型由系统中CPU体系结构的实现决定,所以建议目标的字节顺序类型与处理器的字节顺序类型相匹配。在对第三方IP选型时要考虑的另一个因素是确认其是否支持双字节顺序结构,以使IP可以方便地编程为大端模式或小端模式以与系统无缝集成。

有两种连接相反字节顺序外设的方法。根据应用的需要,要么选择将地址保持稳定(在地址不变处字节保持在同一地址)或者将位顺序保持稳定(在数据不变处地址改变)。

  • 保持数据完整性(数据不变)

由于不同的字节顺序模式下多字节域具有不同的字节地址,因此,如果将多字节域作为单个条目进行操作,那么当其在各IP之间移动时,必须保留该条目的位次序。

对于跨字节边界的多位域也同样如此。比如,一个含16位控制寄存器编程模型的IP。如果控制寄存器位域 [8:7] 定义了控制域,那么要求对于所有访问控制寄存器的操作,要保持该16位之间的稳定关系,而不再与字节顺序有关。

为了理解匹配字节顺序以使数据位顺序完整的过程,以由小端模式的外设接收连续帧并将接收到的数据通过DMA/CPU保存到系统存储器举例。
在这里插入图片描述
接收到的连续帧以Type、H2、H1和H0的顺序保存在外设存储器中。帧中的域可能跨多个字节并不在字节边界处终止,例如状态域可能是12位。所以对于应用程序来说,数据不会因为字节顺序转换而改变就显得很重要,因为这样软件就可以以该顺序处理数据了。

在这里插入图片描述
在上图中,数据按小端寻址保存在外设的存储器中。现在当数据要传送到大端模式的系统RAM中时,必须保证数据位顺序保持不变。为了用硬件达到这个目的,需要对访问外设RAM的存储器的地址进行修改。对地址的改动基于要传送数据的大小,如下所示:
在这里插入图片描述在这里插入图片描述
使用上面的逻辑,对地址总线最后两个LSB取反,数据不变,对应HDL代码如下:

assign	le_ram_addr[31:0] = (Size = 8-bits) ? 
							{ram_addr[31:2], ~ram_addr[1], ~ram_addr[0]};
							(Size = 16-bits) ? 
							{ram_addr[31:1], ~ram_addr[0], ~ram_addr};

assign	le_ram_data[31:0] = data[31:0];

使用上面的方案可以使字节顺序转换对软件透明,并能确保数据完整性在字节顺序转换过程中不会被破坏。

从小端设备到大端存储器,并保持数据不变的数据流如下所述:
1)DMA发出对外设存储器的读字节操作。
2)若系统产生的地址为0x00,在数据变化的实现中,小端模式设备RAM所看到的地址为0x03。
3)设备存储器对该地址解码,访问位31:24即Type域。
4)外设输出该值为{Type, 0x000000} (32位输出)。
5)DMA对系统的大端存储器发出按字节方式的写操作。
6)再次产生0x00地址(字节访问)。
7)大端存储器将该访问解码为写入位31:24。
8)由于来自于小端存储器的数据处于同样的字节区域,因此可以保持数据的完整性并将数据保存在大端RAM中。
9)对其他需要从外设RAM传输到系统RAM中的数据继续进行该操作。
10)16位和32位访问过程与上面所述相同,只是地址需要加以改变。

  • 地址不变

与数据不变的字节顺序转换相比,某些应用程序或系统不需要数据保持特定的次序,但是需要在字节顺序转换后数据字节保持在同样的地址区域。这时就需要使用地址不变的字节顺序变换。

参考同一个接收连续帧的例子,对于地址不变的系统,访问字节Type的地址偏移量永远是0x3。而在前一节中,访问该字节需要使用不同的地址偏移量。为了用硬件实现该过程,需要修改或交换从外设RAM中读到的数据值,RTL代码如下所示:

assign	le_ram_addr[31:0] = ram_addr;
assign	le_ram_data[31:0] = data[0:31];

字节转换顺序如下图所示:

在这里插入图片描述

使用地址不变方式,从小端外设到大端存储器的数据流如下所述:
1)DMA发出对外设存储器的读字节操作。
2)若系统产生的地址为0x00,地址不变的实现使地址值始终相同。
3)外设RAM对该地址解码,访问位[7:0]或H0区域。
4)外设输出的数据为{0x000000, H0} (32位输出)。由于字节顺序匹配时地址不变,给系统RAM的数据变为{H0,0x000000} 。
5)DMA发出对系统大端存储器的字节写操作。
6)再次产生地址0x00(字节访问)。
7)大端存储器将该访问解码为写入位[31:24] 。
8)在字节顺序转换完成后,从小端存储器读出的数据已处在同样的地址区域,把地址存入大端RAM。
9)对其他需要从外设RAM传递到系统RAM的字节继续进行以上操作。
10)对16位或32位的访问,上述过程是相同的,只需将输出的数据进行交换即可。

  • 软件字节交换

交换字节是实现字节顺序转换的一种方式。在由应用程序本身决定字节顺序的系统中,该模式是有用的。因此,无需用硬件实现这种字节顺序匹配过程。字节顺序中性代码的字节交换方法使用字节交换控制来决定是否必须进行字节交换过程。

在软件中通常使用的各种字节交换方法有:
1)交换汇编指令。
2)用于交换字节的软件库宏。
3)协议特定的交换函数。
4)制定的交换函数。

该方法的限制在于,在软件中实现交换功能会增加额外开支。位交换所引起的软件开支虽然存在,但是在需要处理的包的数量很多时开支引起的问题很容易修复,特别是在高频处理器中。

6.字节顺序中性代码

避免由字节顺序所引发问题的最好方法是在设计中使用字节顺序中性。可以通过两种途径完成这一任务:

  • 将字节顺序选项作为软件可配置的选项。
  • 在设计(IP)中使用字节使能,并将解码的任务留给系统或SOC。

7.字节顺序中性编码指南

字节顺序中性代码可以通过标识外部软件接口实现,遵循下面的指南来访问这种接口:

  • 数据存储和共享存储体,数据必须以独立于字节顺序体系结构的格式保存。
  • 字节交换宏,宏(或包装器)能用于所有多字节数据接口进行交换操作。
  • 数据传送,可以建立特定宏来从网络读数据或将数据写到网络中。根据输入数据的类型(如果它与本地主机字节顺序格式不匹配),可用宏来进行批量字节的交换。
  • 位域,避免定义跨越字节边界的位域。
  • 编译器指令,在使用会影响到数据存储(对齐、包装)的编译指令时要小心。指令在不同编译器之间并不是总能移植的。

遵守字节顺序中性指南能使代码有更好的移植性,可以使同一源码运行在不同字节顺序结构的处理器上,从而减少了平台移植时的负担。

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

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

相关文章

基于百度地图的交通查询的毕业设计(android)

目 录 1 前言 1 1.1 背景 1 1.2 论文主要内容与结构 1 2 基础技术介绍(一) 2 2.1 Android概述 2 2.2 Android架构 2 2.3 Android应用程序类型分析 5 3 基础技术介绍(二) 6 3.1 地图简介 6 3.1.1 地图概念 6 3.1.2 构成…

力扣(LeetCode)97. 交错字符串(C++)

动态规划 状态转移方程 f[[i,j]f[i−1,j]∣∣f[i,j−1]f[[i,j] f[i-1,j]\ ||\ f[i,j-1]f[[i,j]f[i−1,j] ∣∣ f[i,j−1] ,仅当最后一个字符匹配。 class Solution { public:bool isInterleave(string s1, string s2, string s3) {int n s1.size(),m s2.size();…

更够实现输入检验输入框

输入检验输入框 效果展示 概述 本文讲解如何书写&#xff0c;可以根据输入内容的在鼠标失去焦点的时候&#xff0c;进行检验的输入框。 构建HTML框架 <body><div class"register"><input type"password" class"ipt"><p…

「Redis」06 事务与锁机制

笔记整理自【尚硅谷】Redis 6 入门到精通 超详细 教程 Redis——事务与锁机制 1. Redis的事务定义 Redis 事务是一个单独的隔离操作&#xff1a;事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中&#xff0c;不会被其他客户端发送来的命令请求所打断。注意&…

[附源码]Python计算机毕业设计SSM教师业绩考核和职称评审系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

D-024 VGA硬件电路设计

VGA硬件电路设计1 简介2 引脚定义3 硬件电路实战4 硬件设计要点1 简介 VGA&#xff08;Video Graphic Arrary&#xff09;即视频图形阵列&#xff0c;是 IBM(国际商业机器公司)在 1987 年随 PS/2 机一起推出的使用模拟信号的一种视频传输标准&#xff0c;在当时具有分辨率高、…

基于STM32的智能GPS定位系统(云平台、小程序)

背景及目标 前阵子&#xff0c;准确的说是好几个月前买了一辆电瓶车&#xff0c;当时呢因为车停得很随意&#xff0c;所以想给小电驴装一个GPS&#xff0c;一方面是防盗&#xff0c;另一方面是为了测速和绘制骑行轨迹&#xff0c;要是能联动电瓶车状态远程监测就更好了。当然我…

马上年末了,你还不会写测试总结吗?

最近参与了几次面试&#xff0c;面试者的简历中都会提及&#xff1a;需求或者版本测试结束后会进行测试总结&#xff0c;不仅仅提供一份测试报告以及相关文档手册。 于是特意追问了一下&#xff0c;测试总结中都包含什么内容。 答复上基本都是&#xff1a;执行了多少用例、发…

帝国cms漏洞分析前台XSS漏洞

帝国cms漏洞分析前台XSS漏洞 一、帝国cms漏洞描述 该漏洞是由于javascript获取url的参数,没有经过任何过滤,直接当作a标签和img标签的href属性和src属性输出。 二、帝国cms漏洞复现 1、需要开启会员空间功能(默认关闭),登录后台开启会员空间功能。 2、漏洞出现的位置在/…

AR+GIS赋能地下管线,匹配真实位置

地下管线是城市运行的生命线&#xff0c;对保障城市运行起到至关重要的作用。但是地下管线都埋藏于地下看不见&#xff0c;摸不着&#xff0c;当工程师需要查看或者检修地下管线时往往就不那么方便了&#xff0c;经常发生破坏地下管线的事故&#xff0c;那有没有什么技术可以让…

122页6万字消防大数据平台建设方案

目 录 第1章 设计说明 1.1 工程概述 1.1.1 工程名称 1.1.2 承建单位 1.1.3 建设目标 1.1.4 建设内容 1.1.5 建设规模 1.1.6 建设周期 1.2 设计依据 1.3 相对可行性研究报告批复的调整情况 1.4 合理化建议 1.4.1 统一、开放的通讯协议标准 1.4.2 充分利用联网单位消…

Git分支管理,运维知道吗?

需求 对于代码的管理&#xff0c;不知你是否遇到过以下几种情况&#xff1a; 存在多种版本管理工具&#xff0c;如svn、git&#xff0c;无法做到代码统一管理&#xff1b;多人协作开发&#xff0c;代码合并冲突频发&#xff1b;分支管理混乱&#xff0c;存在很多个性化分支&a…

常用工具类之spring-boot-devtools热部署

SpringBoot热部署 热部署不会用在生产环境&#xff0c;但对于程序员开发的效率&#xff0c;还是有一定帮助的&#xff0c;所谓的热部署&#xff0c;就是在应用程序在不停止的情况下&#xff0c;实现新的部署 spring-boot-devtools 是一个为开发者服务的一个模块&#xff0c;其中…

JAVA小区门户网站(源代码+论文)

小区门户网站之社区共享 摘 要 随着计算机的不断发展和广泛应用&#xff0c;人们的工作效率得到不断的提高。互联网的发展&#xff0c;更是缩短了人们之间的距离。如何充分利用互联网&#xff0c;这是大家共同关心的问题。本文主要介绍了关于小区门户网站之社区共享的实现方法…

【GD32F427开发板试用】IAR flash loader 下载GD32F427流程简要分析

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;andeyqi 很高兴获的社区的GD32F427开发板的评测机会&#xff0c;这几年芯片慌大家都能感受到&#xff0c;项目上经常因为货源紧张不断更换替代…

java面向对象 继承 多态

目录 继承性(inheritance) 为什么要有继承&#xff1f; 作用&#xff1a; 继承举例 方法的重写 重写举例 四种访问权限修饰符 关键字—super 关键字super举例 调用父类的构造器 调用父类构造器举例 子类对象的实例化过程 多态性 概念 使用 多态性应用举例 虚…

探花交友_第6章_圈子互动(新版)

探花交友_第6章_圈子互动&#xff08;新版&#xff09; 文章目录探花交友_第6章_圈子互动&#xff08;新版&#xff09;课程说明1. 动态查询1.1 查询好友动态1.1.1 接口文档1.1.2 代码步骤1.1.3 代码实现tanhua-app-server**MovementController****MovementService**tanhua-dub…

centos7磁盘挂载及目录扩容

centos7磁盘挂载及目录扩容1. Linux文件系统介绍1.1 ext21.2 ext41.3 xfs2. 查看磁盘现状2.1 查看硬盘情况2.2 查看磁盘挂载情况3. 磁盘挂载3.1 mount挂载3.2 通过UUID来进行挂载4. 目录扩容5. 参考资料项目申请的服务器资源&#xff0c;初始化阶段&#xff0c;运维人员未及时考…

ES 8.x 新特性:match_phrase 跨值查询中 position_increment_gap 参数用法

文章目录1、概述2、match_phrase 短语搜索3、跨值访问3.1 问题演示3.2 原因3.3 解决方案3.4 position_increment_gap 参数1、概述 在 ES 中进行短语搜索的时候&#xff0c;为了防止跨值访问&#xff0c;ES 会在每个值之间设置间隙&#xff0c;而这个间隙的默认大小为 100。而这…

【密码学篇】商用密码产品的密钥体系结构小结

【密码学篇】商用密码产品的密钥体系结构小结 商用密码产品的密钥体系结构笔记小结—【蘇小沐】 文章目录【密码学篇】商用密码产品的密钥体系结构小结1.商用密码产品密钥体系结构&#xff08;一&#xff09;服务器密码机密钥体系结构1.服务器密码机密钥体系结构2.服务器密码机…