SylixOS中端模式处理方式总结

1. 端模式简介

端模式(Endian)表示数据在存储器中的存放顺序。大端模式(Big-endian),将数据的低位保存在高地址中,而数据的高位,保存在低地址中。小端模式(Little-endian),将数据的低位保存在内存的低地址中,而数据的高位保存在高地址中。

1.1      端模式对数据字节序的影响

对于内存数据字节序,大端模式高字节(MSB)存放在低地址,低字节(LSB)存放在高地址;小端模式低字节(LSB)存放在低地址,高字节(MSB)存放在高地址。如果将一个32位的整数0x12345678存放到一个整型变量(int)中,这个整型变量采用大端或者小端模式在内存中的存储如图 1.1所示。

图 1.1 大小端模式在内存中的存储

1.2      端模式对处理器寄存器的影响

对于处理器的寄存器而言大小端模式也存在区别。大端处理器,比如PowerPC,将其寄存器的最高位msb(most significant bit)定义为0,最低位lsb(least significant bit)定义为31;而小端处理器正好相反,将其寄存器的最高位定义为31,低位地址定义为0。大小端寄存器位图区别如图 1.2所示。

图 1.2大小端模式CPU的寄存器位图分布

1.3      端模式对数据总线的影响

从数据总线角度而言,大端模式下32位数据总线的msb是第0位,MSB是数据总线的第0~7的字段;而lsb是第31位,LSB是第24~31字段。小端模式下32位总线的msb是第31位,MSB是数据总线的第31~24位,lsb是第0位,LSB是7~0字段。

1.4      端模式转换

网络上的绝大多数协议都采用大端编址方式进行编址,因此在有关网络协议的软件设计中,使用小端方式的处理器需要在软件中处理端模式的转变。

大端处理器采用32位总线与小端外设进行访问时,大端处理器的32位数据总线的第0~7位对应小端外设的第31~24位,第8~15位对应第23~16位,第16~23位对应第15~8位,第24~31位第7~0位。有两种处理方式可以解决此问题:(1)在硬件上将数据线0-31和31-0进行反接;(2)从软件上解决这个问题,在底层读写寄存器函数中,将读/写的数据进行大小端转换。

2. SylixOS中对端模式的处理

2.1      大小端模式数据转换

大小端模式数据转换实际就是对字节序进行交换,以32位数据为例,转换接口bswap32就是将高低字节进行转换。

bswap32(uint32_t x)
{
    return  (uint32_t)((((x) & 0x000000ff) << 24) |
                       (((x) & 0x0000ff00) <<  8) |
                       (((x) & 0x00ff0000) >>  8) |
                       (((x) & 0xff000000) >> 24));
}

2.2      外设操作通用接口

SylixOS中对于大小端的操作接口与Linux做了兼容。因为普通的外设基本上都是小端模式,对外设的内存操作可以直接使用图 2.1一组接口进行,这些操作屏蔽了大小端的差异。

图 2.1 通用接口

以writel为例,分析下具体的实现。writel是一个宏,展开后实际上是对内存地址的写操作,关键点是对要写入的数据通过htole32进行了转换。htole32接口通过不同CPU定义的大小端模式,判断是否进行大小端数据转换,如果是大端就调用bswap32进行转换,如果是小端不转换。

#define writel(val, addr)   write32(htole32(val), (addr_t)(addr))#define write32(d, a)      write32_raw(d, a)static LW_INLINE VOID  write32_raw (UINT32  uiData, addr_t  ulAddr){
    KN_IO_WMB();
    *(volatile UINT32 *)ulAddr = uiData;
    KN_IO_WMB();
}

2.3      外设操作特殊接口

根据不同的CPU形态还定义了一些特殊处理接口,可以指定对大小端设备的操作,具体如图 2.2 特殊接口所示。后缀_le接口代表以小端模式操作,_be代表以大端模式操作。

图 2.2 特殊接口

具体实现跟通用接口类似,都是根据不同CPU的大小端模式与要操作的模式是否相同,判断是否需要进行字节序转换。比如PPC的处理器要写入处理器内部的寄存器,因为寄存器也是以大端模式存储的,可以调用write32_be来实现。

原文地址:http://blog.51cto.com/13578681/2062542

时间: 2024-10-08 19:49:48

SylixOS中端模式处理方式总结的相关文章

数据在内存中存储的方式:大端模式与小端模式

什么是大端模式,什么是小端模式? 所谓的大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放: 所谓小端模式(Little-endian), 是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内在的低地址中,这种存储模式将地址的高低和数据位 权有效结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致; 为什么有大小端之分: 因

从内存中堆栈的分配格局解析大小端模式

今天找了一整天的资料,企图弄懂大小端模式的区别,但是弄了很久还是弄不懂.后面尝试从内存中的分配格局来区别,找了大.小端模式下的内存分配格局进行比较,就弄懂了. 先贴出基本知识: 所谓的大端模式Big-endian,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放: 所谓的小端模式Little-endian,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中,这种存储

存储中的大端模式和小端模式详解

什么是大端,什么是小端: 所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中: 所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中. 为什么会有大小端: 为什么会有大小端模式之分呢?这是因为在计算机存储系统中,我们是以字节为单位进行管理的,每个内存中的地址单元都对应着一个字节,一个字节为8bit.但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大

微信端网页中图片的展示方式

一.微信端网页中图片的展示方式 微信端网页中图片有两种展示方式:平铺与图集.平铺的时候文档内的所有图片全部展开,点击图片则放大.图集的时候只展示一张图片,点击图片的时候以翻页的方式展示一组图片.实现原理对于如下一个图片标签,data-gid用于存放组标识,同一组的data-gid相同.data-index用于存放组中图片的展示顺序,不能相同.onclick中根据data-src处理图片展示.对于图集就只显示一张其他的img设置为隐藏,src与第一个图片一样,或者为空,这样可以减少网页的加载量,提

认识计算机中的大小端模式

前言 在java中java.nio包下有一个类是ByteOrder,这是什么东东,相信有很多人不知道.在我看了关于java.nio中有本书中就介绍到了.我努力的回忆我大学课本中学到过吗,好像没有.这是计算机理论方面的知识了.百度百科中就有关于"大小端模式的介绍".猛击这里吧 大小端模式的定义 大端模式,是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放: 小端模式,是指数据

php在apache中一共有三种工作方式:CGI模式、FastCGI模式、Apache 模块DLL

php在apache中一共有三种工作方式:CGI模式.FastCGI .FastCGI是什么? FastCGI是语言无关的.可伸缩架构的CGI开放扩展,其主要行 为是将CGI解释器进程保持在内存中并因此获得较高的性能.众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中 并接受FastCGI进程管理器调度,则可以提供良好的性能.伸缩性.Fail-Over特性等等. FastCGI的官方站点在http://www.fastcgi.com 1.Web Server

详解大端模式和小端模式

详解大端模式和小端模式 原文地址:http://blog.csdn.net/ce123_zhouwei/article/details/6971544 一.大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的<格利佛游记>:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战.战争的原因:大家都知道,吃鸡蛋的时候,原始 的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,

大端模式和小端模式的区别

大端模式和小端模式的区别 在C语言中除了8位的char型之外,还有16位的short型,32位的long型(要看具体的编译器),对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着如何将多个字节安排的问题.因此就导致了大端存储模式和小端存储模式. 大端模式: 字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中. 小端模式: 与大端存储模式相反,在小端存储模式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节. 例如,16位宽

Linux网络编程1&mdash;&mdash;小端模式与大端模式

数据存储优先顺序的转换 计算机数据存储有两种字节优先顺序:高位字节优先(称为大端模式)和低位字节优先(称为小端模式).内存的低地址存储数据的低字节,高地址存储数据的高字节的方式叫小端模式.内存的高地址存储数据的低字节,低地址存储数据高字节的方式称为大端模式. eg:对于内存中存放的数0x12345678来说(注意,对于数据而言,此处12是高字节,78是低字节:对于地址而言,左边是低地址,右边是高地址) 如果是采用大端模式存放的,则其真实的数是:0x12345678 如果是采用小端模式存放的,则其