硬件篇之字节序

linux arm32 mmu 启动代码分析(汇编部分) linux arm32启动代码分析 首先将 linux kernel 代码编译好以后,在目录 arch/arm/kernel 下生成链接脚本文件 vmlinux.lds (vmlinux.lds由vmlinux.lds.S编译而来)。首先分析此脚本来熟悉 linux kernel 二进制代码分布结构。 在 vmlinux.lds.S 中 ENTRY(stext) 指明了linux内核入口,入口为stext。符号stext定义在 arch/arm/kernel/head.S 文件中: .arm __H 阅读详情

    很多人讨厌碰到字节序问题,跟它打交道就像走迷宫,每次都要牺牲不少脑细胞。即使这一次似乎搞清楚了,下次碰到还是要重新在大脑里构建和模拟。这里尽量做一个字节序问的完整备忘记录。

主机字节序

    多字节数据在内存中的字节排列顺序称为主机字节序,主机字节序基本由CPU硬件决定,某些CPU如X86、Z80等为little-endian;有些如moto6800、sparc等为big-endian;而有些CPU可通过寄存器设置支持不同字节序,如ARM、MIPS等,这类平台上不同OS可能配置了不同字节序。

    理解字节序需要知道两个名词:MSB (Most Significant Byte),代表一个数中权值最大的字节;LSB(Least Significant Byte),代表一个数中权值最小的字节。比如十进制数1234,1权值为千位,最大,相当于MSB;4为个位,权值最小,相当于LSB。那么真正以字节为单位考虑, 4字节数0x12345678里那个是MSB/LSB呢?

    主机字节序分Big-Endian和Little-Endian两种,定义为:

    a. Little-Endian,又称低字节优先,是把LSB放在内存低地址端,MSB在内存高地址端。举例,4字节数0x12345678在little-endian体系的内存中存放(从地址0x1000开始)为: 

 

    b. Big-Endian,又称高字节优先,把MSB放在内存低地址端,LSB放在内存高地址端。0x12345678此时存放为: 

 

    big-endian沿地址增长方向先放高权位数字的方式恰好符合一般习惯(按照千,百,十,个位来书写数字)。这也是为什么初学者变换endian时总觉得big-endian比较正常。

    字节序问题有时会被扩大化,有人一碰到奇怪问题就怀疑字节序。其实它只存在于多字节数据在内存中的解析,注意:1)多字节数据;2)内存中的排列。

    a. 多字节数据是指诸如long int short等需要多个字节存储的数据类型,而象char等用一个字节表示的类型永远不会有字节序问题。

    b. CPU通用寄存器都是整体操作,不存在单字节地址以及地址增长方向的概念,因此也没有MSB/LSB在前或在后的问题,只有内存中的多字节数据存储才会有这两种差异。从硬件角度看,CPU是直接通过数据总线连接内存和CPU寄存器,这中间没有额外字节序转换的硬件开销,只是不同总线连接方式导致了不同字节序,如下图(from wiki): 

信息交换中的字节序

    当不同类型平台通过某种媒介交换信息时需要考虑字节序问题,常见介质主要指文件和网络。通过文件或网络读取来自其它主机的多字节数据时,要警惕字节序问题。如x86和moto6800主机通过文件交换信息时,如果不转换,数据处理就不匹配。在x86 VC下运行如下代码:

    void main( )

    {

      FILE* fp;

      short a = 0x3132;   //为ASIIC码’12’

      fp = fopen ("c:test.txt", "wb")

      fwrite(&a, sizeof(short), 1, fp);

      fclose(fp);

    }

    代码中a的值0x3132即'12’,由于x86为little endian体系,内存中多字节LSB(这里即0x32)在前,所以运行后打开test.txt文件,内容是'21'。把test.txt文件复制到moto6800机器上,再用fread把文件内容读到short变量里,得到的就不是0x3132而是0x3231了,数据就此被颠倒,后续处理完全错误。

    假设我们制定了介质层字节序标准(如big-endian),要通过软件屏蔽不同endian体系的差异,需要两步操作,一判断endian类型:

    typedef union {

      u16 a;

      u8 b[2];

    }ENDIAN;

    /* judge cpu is big endian(0) or small endian(1) */

    bool judge_endian(void)

    {

      ENDIAN t;

      t.a = 0x0001U;

      return (bool)(t.b[0] == 1);

    }

    想想指针怎么做?

    判断完两端主机的endian之后,要根据情况做相应endian交换,即发送和接收任何一方只要不符合媒介层标准(big-endian),就要通过移位和位操作,在主机序和媒介序之间转换。一方发送数据前要先将内存数据由主机字节序转换为传输介质层的字节序,再发送出去,接收方收到数据后,要转换为本地的主机字节序,再做后续处理。

    比如TCP/IP协议的socket通信,基于socket通讯的双方一般选择Big-Endian为标准,又称网络字节序。socket定义了一组转换函数,用于多字节数在网络字节序和主机字节序之间的转换。htonl,htons用于主机序转换到网络序(如主机本身big endian,函数实际啥也不做);ntohl,ntohs把网络序转换到本机序(同样)。因此傻瓜式做法,无论发送方主机字节序是什么,发送前都用htons或htonl将多字节数据转换为网络字节序;同样无论接收方主机字节序是什么,都用ntohs或ntohl把接收的网络数据转换为本地主机字节序。这样有了网络字节序标准,socket通信时,只需套用这几个函数就能方便地抹平主机间的字节序差异。

    问题在于如果双方主机都与网络字节序相反,本来是可以直接通信的,却用htonl/ntohl等转过去又转回来,有点自找麻烦。这就要看软件的预期运行环境,以及怎样平衡软件效率和多平台通用性。

补充SOC内部的字节序

    soc中除主CPU外,一些外设中(如硬件媒体编解码器)还包含内部MCU,它们之间一般通过高速总线共享外部DDR,通过低速总线共享外设寄存器。这时如果双方的endian属性不匹配,对host cpu驱动及MCU上的固件编写会造成一定困扰。

总结

    真正理解大小端的本质可能要从硬件系统角度,涉及CPU指令集、寄存器、总线以及硬件外设等。但对程序员来说,能够了解字节序问题的存在范围以及如何实现移植性更高的代码,这就足够了。

  Tip:对于ARM等可配置的CPU,其编译工具中会有big/little endian的选项,程序移植时也需要注意,如果跟系统设置不匹配,编译得到的目标程序就无法运行。

01-第一个裸机程序led及其引申 第一节 硬件知识_LED原理图 1、 点亮LED需要做的事情: (1) 看原理图确定控制LED的引脚; (2) 看主芯片手册,确定如何设置/控制引脚; (3) 写程序。 2、 LED原理图 再改进:如果引脚能力不足,可以用三极管,使引脚仅起开关作用。 注:主芯片引脚输出高/低电平即可改变LED状态,所以我们不用去关心GPIO引脚输出的到底是3.3V还是1.2V。 第二节:S3C2440启动流程与GPIO 1、原理图中的net 注:韦东山的LED1的引脚为GPF4,我的友善之臂板子是GPB5;另外 阅读详情

相关推荐

C语言中的大端字节序和小端字节序是什么?如何进行字节序的转换?

理解大端字节序和小端字节序的原理以及如何进行字节序的转换,是C语言程序员必备的基础知识之一。在计算机中,存储器是以字节为单位进行访问的,而在多字节的数据类型(如整数、浮点数)的存储过程中,涉及到字节的顺序问题,即字节序。大端字节序和小端字节序是两种常见的字节序,它们决定了多字节数据在内存中的存储方式。为了解决这个问题,常常需要进行字节序的转换。相反,小端字节序中,数据的低字节存储在低地址,而数据的高字节存储在高地址。在进行字节序转换时,可以使用调试工具观察数据在内存中的存储顺序,确保转换的正确性。

weixin_68551689的博客 3062

我记不住的那些命令-xxd&od

这里记录一下具体的xxd和od命令参数和使用方法,我想我肯定是记不住这些参数的。

企鹅菜鸟的成长过程 2525

如何在Java中处理网络字节序和主机字节序?

在Java中处理网络字节序和主机字节序主要涉及字节序转换的问题,特别是在网络通信中,需要确保数据在不同主机之间传输时字节序的一致性。以下是在Java中处理网络字节序和主机字节序的一般方法:

m0_47946173的博客 1460

什么是字节序(端序、低端字节序、高端字节序、网络字节序)

字符串12在内存中的第一个字节到底是什么?本篇文章将详细解释字节序、比特序与端序的概念。

qq_30576521的博客 6068

大小端字节序详解

正确区分大小端字节序,手把手带你做大小端面试题。

威威的博客 6544

Obsidian+llama3:终于搭建了自己的知识库

Obsidian 的 Smart Connections,超出了我原本的预期,于是结合新模型非常方便地搭建了我的个人知识库。

谢彦的技术博客 3712

【字节序】

不同计算机体系结构可能采用不同的字节序来存储多字节数据。字节序有两种主要形式:大端序(Big-endian):高位字节存储在低地址。小端序(Little-endian):低位字节存储在低地址。为了确保不同平台之间的数据一致性,需要明确数据的字节序,并在传输或存储时进行适当的转换。

anmo_moan的博客 482

ERA5气象数据下载与解压全攻略:Python脚本一键搞定(附错误处理技巧)

本文提供了一套完整的ERA5气象数据自动化处理方案,涵盖从CDS API配置、智能批量下载到高效解压与数据验证的全流程。重点介绍了如何通过Python脚本实现一键式数据下载与批量解压,并分享了实用的错误处理技巧与性能优化策略,帮助科研人员高效获取和处理大规模气象数据。

k8l9m0n的博客 338

字节顺序:高位优先(big-endian)和低位优先(little-endian)

字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。基于X86平台的PC机是小端字节序的网络字节序: MSB 高字节前存法 Most Significant Bit (Big Edian)主机字节序: LSB 低字节前存法

爱橙子的OK绷的专栏 1万+

PX4开发环境搭建(Ubuntu1804+QGC+Qt Creator )

文章目录前言一、安装环境二、PX4环境搭建1. 在虚拟机中安装Ubuntu2. 安装PX4环境(1)下载PX4源码:(2) 安装工具链(3) jMAVSim仿真(4) 编译验证三、安装QGC四、安装Qt Creator 前言 在这之前作者完全没接触过PX4,安装过程遇到了很多坑,而且每安装下载一个东西都要等好久,出现问题又要重新开始,前后折腾了四天才弄好,希望此文对大家有所帮助。 一、安装环境 ...

Beyonderwei的博客 9023

智能优化电池:基于单片机的电池管理系统

设计简介: 本设计是基于单片机的电池管理系统,主要实现以下功能: 可通过LCD1602显示温度、电压电流值; 可通过按键调整温度、电压和电流的阈值; 用ADC0832将模拟量转换为数字量。 标签:51单片机、LCD1602、ADC0832 效果图: 总体资料: 原理图: 软件设计流程: 系统框图: 本设计以STC89C52单片机为核心控制器,加上其他的模块一起组成电动汽车的电池管理的整个系统,...

专注单片机实战教学,分享单片机学习资料 375

字节序问题--大端法小端法

一、字节序定义 字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。 其实大部分人在实际的开发中都很少会直接和字节序打交道。唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。 在所有的介绍字节序的文章中都会提到字节序分为两类:Big-Endian和Little-Endian。引用标准的Big-End

老孙 1万+

《QGIS快速入门与应用基础》230:添加图例工具

本文系统讲解QGIS图例制作的核心方法与优化技巧。首先强调图例与地图框的绑定逻辑,提出三种绑定状态及适用场景。详细拆解三种图例添加方法:布局工具栏一键添加法(新手首选)、菜单栏添加法和右键快捷创建法,并给出单地图框和多地图框两种典型场景的规范技巧。重点解决新手常见的图例杂乱、样式不规范、内容脱节等问题,帮助用户从基础图例制作进阶到符合行业标准的专业图例设计。通过分步操作图示和实用技巧,使读者能够快速掌握图例创建的核心流程与优化方法。

LuckyHanMo的博客 551

嵌入式基础知识硬件篇之字节序

很多人讨厌碰到字节序问题,跟它打交道就像走迷宫,每次都要牺牲不少脑细胞。即使这一次似乎搞清楚了,下次碰到还是要重新在大脑里构建和模拟。这里尽量做一个字节序问的完整备忘记录。 主机字节序 多字节数据在内存中的字节排列顺序称为主机字节序,主机字节序基本由CPU硬件决定,某些CPU如X86、Z80等为little-endian;有些如moto6800、sparc等为big-endian;而有

lakeheart879的专栏 778

2024顶级提示工程工具:提升效率的12个神器

LlamaIndex虽然本身不是直接的提示词编辑工具,但其整个设计都围绕着如何有效地将外部知识融入LLM的提示词。它提供了结构化的方式来管理“上下文窗口”——即哪些私有数据应该被包含在提示词中。通过优化索引结构和检索策略,可以确保提示词中包含最相关、最高质量的上下文信息,从而大幅提升LLM基于私有数据回答问题的准确性和相关性。同时,LlamaIndex允许开发者针对不同的查询类型和数据特点定制提示词模板,这使得提示词的复用和优化更加系统化。

AIGC应用创新大全的博客 1099

实战篇| app爬虫不用真机

之前写过一篇基于真机app爬虫《App爬虫实战篇-以华为真机手机爬取集换社的app为例》,如果大家有用真机爬虫的经历,会深刻认识到真的不方便,一是自己的手机,经常会被电话、微信等打断,二是闲置手机,面对小批量数据还能勉强,大批量爬虫,会导致成本指数级上升,并且控制起来相对麻烦。以下就是常见的模拟器。emulator -avd my_avd -no-snapshot-save # 启动时不保存 snapshot。emulator -avd my_avd -wipe-data # 清除数据(恢复到出厂)

youbingchen的博客 597

理解字节序 大端字节序和小端字节序

以下内容参考了 http://www.ruanyifeng.com/blog/2016/11/byte-order.html https://blog.youkuaiyun.com/yishengzhiai005/article/details/39672529 1. 计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。 举例来说,数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11。 大端字节序:高位字节在前,低位字节在后

一颗橙 8251

30、航空公司调度问题的数学模型解析

本文详细解析了航空公司调度问题中的核心数学模型,包括航班时刻表生成、机组人员排班和飞机调度的建模方法与求解技术。通过定义变量、约束条件及目标函数,结合线性规划、整数规划等方法,帮助航空公司实现高效调度。文章还探讨了模型的优化策略、简化方法以及实际应用案例,为提升航空运营效率提供了理论支持和实践指导。

beer8的博客 259

网络字节序和主机字节序详解!!!

我们都知道,如今的通讯方式已经趋向与多样化,异构通信(计算机软件(操作系统) +    计算机硬件(内核架构,ARM,x86)不同)也已经很普遍了,如,手机和电脑中的qq进行通信,,, 同时,在计算机设计之初,对内存中数据的处理也有不同的方式,(低位数据存储在低位地址处或者高位数据存储在低位地址处),然而,在通信的过程中(ISO/OSI模型和TCP/IP四层模型中),数据被一步步封装(然

L未若的博客 3万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

轻松理解硬件逻辑字节序和软件字节序

轻松看懂硬件逻辑字节序和软件字节序 概念 字节序,就是 大于一个字节类型的数据在内存中的存放顺序。并且软硬件的字节序理解完全不一致; 分类 字节序经常被分为两类: Big-Endian(大端):高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。 Little-Endian(小端):低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。 例子 对于数据 0x12345678,假设从地址0x4000开始存放,在大端和小端模式下,存放的位置分别为: 内存地址 小端模式 大端模式

视频拼接器 717

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

字节序中大端字节序和小端字节序

最近参加面试遇到一些面试题,有些很常用的东西,但是不能准确说出所以然,拜读了https://blog.youkuaiyun.com/weixin_53361650和https://blog.youkuaiyun.com/taoshihan二位作者的文章,感觉清晰了不少,十分感谢二位博主的资料让我明白了原因。

weixin_46068274的博客 1334

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

轻松看懂硬件逻辑字节序和软件字节序

轻松看懂硬件逻辑字节序和软件字节序 原创cocotbcocotb 2022-03-13 13:03:52 手机阅读 正在上传…重新上传取消 概念 字节序,就是 大于一个字节类型的数据在内存中的存放顺序。并且软硬件的字节序理解完全不一致; 分类 字节序经常被分为两类: Big-Endian(大端):高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。 Little-Endian(小端):低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。 例子 对于数据

视频拼接器 508

大端字节序和小端字节序

大端字节序和小端字节序 计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。 举例来说,数值0x2211使用两个字节(一字节是8bit)储存:高位字节是0x22,低位字节是0x11。 1、概念 大端字节序:低位字节在高地址,高位字节低地址上。这是人类读写数值的方法。 小端字节序:与上面相反。低位字节在低地址,高位字节在高地址。 从上面的示...

aa98865646的博客 3859

【C语言】大小端字节序详解

计算机系统中的字节序是一个关键概念,影响着数据在内存中的存储方式。其中,C语言的大小端字节序是一个备受关注的话题。了解字节序对于编写可移植性强、跨平台的程序至关重要。在这篇博客中,我们将深入探讨C语言中大小端字节序的概念、影响以及如何处理不同字节序带来的挑战。提示:以下是本篇文章正文内容,下面案例可供参考。

m0_68002296的博客 1802

【网络篇】第四篇——网络字节序

但由于发送端和接收端采用的分别是小端存储和大端存储,此时对于内存地址从低到高为44332211的序列,发送端按小端的方式识别出来是0x11223344,而接收端按大端的方式识别出来是0x44332211,此时接收端识别到的数据与发送端原本想要发送的数据就不一样了,这就是由于大小端的偏差导致数据识别出现了错误。如果编写的程序只在本地机器上运行,那么是不需要考虑大小端问题的,因为同一台机器上的数据采用的存储方式都是一样的,要么采用的都是大端存储模式,要么采用的都是小端存储模式。为什么网络字节序采用的是大端?

m0_58367586的博客 1643
上一篇: C优化篇之减少运算量
下一篇: 硬件篇之总线
ipmux
博客等级 码龄24年 161粉丝 65原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值