大端与小端

                        大端与小端

                                      

端模式(Endian)的出自Jonathan Swift写的《格列佛游》。根据将蛋敲的方法不同将所有的人分,从圆头开始将蛋敲的人被归为Big Endian,从尖头开始将蛋敲的人被归为Littile Endian。小人国的内就源于吃是究竟从大Big-Endian)敲开还是从小Little-Endian)敲。在算机Big EndianLittle Endian也几乎引起一场战争。在算机界,Endian表示数据在存器中的存放序。下文明在算机中大小端模式的区

如果将一个32位的整数0x12345678存放到一个整型量(int)中,个整型量采用大端或者小端模式在内存中的存由下表所示。为简单,本使用OP0表示一个32位数据的最高字MSBMost Significant Byte),使用OP3表示一个32位数据最低字LSBLeast Significant Byte)。

 

地址偏移

大端模式

小端模式

0x00

12OP0

78OP3

0x01

34OP1

56OP2

0x02

56OP2

34OP1

0x03

78OP3

12OP0

 

如果将一个16位的整数0x1234存放到一个短整型量(short)中。个短整型量在内存中的存大小端模式由下表所示。

 

地址偏移

大端模式

小端模式

0x00

12OP0

34OP1

0x01

34OP1

12OP0

 

由上表所知,采用大小模式数据行存放的主要区在于在存放的字节顺序,大端方式将高位存放在低地址,小端方式将低位存放在高地址。采用大端方式行数据存放符合人的正常思,而采用小端方式行数据存放利于算机理。到目前止,采用大端或者小端行数据存放,其孰孰劣也没有定

有的理器系采用了小端方式行数据存放,如Intel的奔。有的理器系采用了大端方式行数据存放,如IBM体和FreescalePowerPC理器。不仅对理器,一些外设计中也存在着使用大端或者小端行数据存放的选择

因此在一个理器系中,有可能存在大端和小端模式同存在的象。硬件设计带来了不小的麻要求系统设计工程,必深入理解大端和小端模式的差。大端与小端模式的差在一个理器的寄存器,指令集,系统总线等各个次中。

1.1.1         件的角度理解端模式

件的角度上,不同端模式的理器行数据传递时要考端模式的不同。如行网数据传递时,必要考端模式的转换。有Socket接口经验的程序一定使用以下几个函数用于大小端转换

¨          #define ntohs(n)     //16位数据型网节顺序到主机字节顺序的转换

¨          #define htons(n)     //16位数据型主机字节顺序到网节顺序的转换

¨          #define ntohl(n)      //32位数据型网节顺序到主机字节顺序的转换

¨          #define htonl(n)      //32位数据型主机字节顺序到网节顺序的转换

其中互网使用的网节顺序采用大端模式址,而主机字节顺序根据理器的不同而不同,如PowerPC理器使用大端模式,而Pentuim理器使用小端模式。

大端模式理器的到网不需要转换,此ntohs(n)=nntohl = n;而小端模式理器的到网转换,此ntohs(n) = __swab16(n)ntohl = __swab32(n)__swab16__swab32函数定如下所示。

#define ___swab16(x)

{

            __u16 __x = (x);

            ((__u16)(

                        (((__u16)(__x) & (__u16)0x00ffU) << 8) |

                        (((__u16)(__x) & (__u16)0xff00U) >> 8) ));

}

#define ___swab32(x)

{

            __u32 __x = (x);

            ((__u32)(

                        (((__u32)(__x) & (__u32)0x000000ffUL) << 24) |

                        (((__u32)(__x) & (__u32)0x0000ff00UL) <<  8) |

                        (((__u32)(__x) & (__u32)0x00ff0000UL) >>  8) |

                        (((__u32)(__x) & (__u32)0xff000000UL) >> 24) ));

}

 

 PowerPC理器提供了lwbrxlhbrxstwbrxsthbrx四条指令用于转换__swab16__swap32这类函数。此外PowerPC理器中的rlwimi指令也可以用来实现__swab16__swap32这类函数。在Linux PowerPC中,定了一系列有转换的函数,其详细./include/asm-powerpc/byteorder.h文件中。

程序普通文件理也需要考端模式问题。在大端模式的理器下文件的3216写操作所得到的果与小端模式的理器不同。单纯件的角度理解上远远不能真正理解大小端模式的区。事上,真正的理解大小端模式的区,必要从系的角度,从指令集,寄存器和数据总线上深入理解,大小端模式的区

1.1.2         从系的角度理解端模式

除了 4.2.1 中,件上不同端模式程上的差异,理器在硬件上也由于端模式问题设计中有所不同。从系的角度上看,端模式问题对软件和硬件的设计带来了不同的影响,当一个理器系大小端模式同存在,必对这些不同端模式的访问进行特殊的理。

PowerPC理器主,可以说绝大多数的通信设备都使用PowerPC理器协议处理和其他控制信息的理,也可能也是在网上的大多数协议都采用大端址方式的原因。因此在有络协议设计中,使用小端方式的理器需要在件中理端模式的转变。而Pentium个人机市,因此多数用于个人机的外都采用小端模式,包括一些在网络设备中使用的PCI总线Flash设备也要求硬件工程在硬件设计中注意端模式的转换

中的小端外是指这种中的寄存器以小端方式行存,如PCI设备的配置空NOR FLASH中的寄存器等等。

于有些设备,如DDR粒,没有以小端方式存的寄存器,因此从逻辑并不需要端模式转换。在设计中,只需要将双方数据总线进行一一对应的互,而不需要行数据总线转换

如果从实际应用的角度,采用小端模式的理器需要在件中理端模式的转换,因采用小端模式的理器在与小端外连时,不需要任何转换

而采用大端模式的理器需要在硬件设计时处理端模式的转换。大端模式理器需要在寄存器,指令集,数据总线及数据总线与小端外接等等多个方面理,以解决与小端外设连的端模式转换问题

在寄存器和数据总线的位序定上,基于大小端模式的理器有所不同。

一个采用大端模式的32理器,如基于E500内核的MPC8541,将其寄存器的最高位msbmost significant bit)定义为0,最低位lsblease significant bit)定义为31;而小端模式的32理器,将其寄存器的最高位定义为31,低位地址定义为0

与此向对应,采用大端模式的32理器数据总线的最高位0,最高位31;采用小端模式的32理器的数据总线的最高位31,最低位04.5所示。

 

 

OP0

 

OP1

 

OP2

 

OP3

 

OP0

 

OP1

 

OP2

 

OP3

 

31

 

0

 

31

 

0

 

4.5大小端模式理器的寄存器的定

 

大端模式理器寄存器位序定

 

小端模式理器寄存器位序定

大小端模式理器外部总线的位序也遵循着同律,根据所采用的数据总线32位,16位和8位,大小端理器外部总线的位序有所不同。

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

¨          大端模式下16位数据总线msb是第0位,MSB是数据总线的第0~7的字段;而lsb是第15位,LSB是第8~15字段。小端模式下16总线msb是第15位,MSB是数据总线的第15~7位,lsb是第0位,LSB7~0字段。

¨          大端模式下8位数据总线msb是第0位,MSB是数据总线的第0~7的字段;而lsb是第7位,LSB是第0~7字段。小端模式下8总线msb是第7位,MSB是数据总线的第7~0位,lsb是第0位,LSB7~0字段。

由上分析,我可以得知8位,16位和32度的数据总线,采用大端模式数据总线msbMSB的位置都不会化,而采用小端模式数据总线lsbLSB位置也不会化。

此,大端模式的理器8位,16位和32位的内存访问(包括外访问)一般都包含第0~7字段,即MSB。小端模式的理器8位,16位和32位的内存访问都包含第7~0位,小端方式的第7~0字段,即LSB

由于大小端理器的数据总线8位,16位和32度的数据总线的定不同,因此需要分别进讨论在系统级别上如何理端模式转换

在一个大端理器系中,需要理大端理器小端外访问

1.1.2 .1    大端理器32位小端外设进访问

大端理器采用32总线与小端外设进访问时,大端理器的32位数据总线的第0~7位用来OP0,第8~15位用来OP1,第16~23位用来OP2,第24~31位用来OP3。而32位的小端设备使用数据总线的第31~24位用来OP0,第23~16位用来OP1,第15~8位用来OP2,第7~0位用来OP3

大端理器,如MPC8541,使用stwsthstblwzlhzlbz指令32位的外部设备进访问。在些指令束后,存放在外部设备的数据将被MPC8541的通用寄存器中。证软件的一致性,当访问结束后,存放在通用寄存器的,即OP0OP1OP2OP3要和存放在小端外一致。此在使用大端理器的数据总线连接小端外设时行一定的理,按照某拓扑接以保证软件的一致性。大端理器数据总线与小端外设进接的拓扑构如4.6所示。

 

OP0

 

OP1

 

OP2

 

OP3

 

31

 

31

 

0

 

7

 

8

 

15

 

16

 

23

 

24

 

24

 

23

 

16

 

15

 

8

 

7

 

0

 

大端理器的32位数据总线

 

小端设备32总线接口

 

4.6 大端理器与小端外32

 

OP0

 

OP1

 

OP2

 

OP3

4.6所示,采用大端理器访问小端设备时,将各自的OP0~OP3字段直接相。在大端理器的32位数据总线的最高位0,最低位31;而小端设备的最高位31,最低位0。因此硬件工程行信号需要将采用大端理器的0~31位分与小端设备31~0位一一对应行互

1.1.2 .2    大端理器816位小端外设进访问

大端理器使用8位,16位数据总线对8位,16位的小端外设进接。32理器,用来接外总线一般是32位。因此体系构工程行大端理器总线设计时有两种选择,是采用32总线的高端部分(第0~15字段)是低端部分(第16~31字段)接小端设备PowerPC理器使用32总线的高端部分,即数据总线的第0~1516位的小端设备,使用0~78位的小端设备

PowerPC理器采用16总线16位的小端外设进访问时PowerPC理器的16位数据总线的第0~7位用来OP0,第8~15位用来OP1。而16位的小端设备使用数据总线的第15~8位用来OP0,第7~0位用来OP1

PowerPC理器采用8总线8位的小端外设进访问时PowerPC理器的8位数据总线的第0~7字段用来OP0。而8位的小端设备使用数据总线的第7~0位用来OP1。大端理器与小端外系如4.7所示。 

OP0

 

OP1

 

OP0

 

OP1

 

15

 

0

 

7

 

8

 

15

 

8

 

7

 

0

 

大端理器的8/16位数据总线

 

小端设备8/16总线接口

 

4.7 大端理器与小端外8/16

 

OP0

 

OP0

 

7

 

0

 

7

 

0

32总线接口似,PowerPC理器可以使用stwsthstblwzlhzlbz指令32位的外部设备进访问,并将数据存放在相的通用寄存器中。当访问结束后,存放在通用寄存器的,即OP0OP1要和存放在小端外一致。

PowerPC理器8位的小端外设进访问时,一个总线周期只能访问8位数据,如果理器使用stw或者lwz指令访问8位的小端设备内的32位数据,在数据总线上将OP0OP1OP2OP3依次传递PowerPC的通用寄存器中。

PowerPC理器16位的小端外设进访问时,一个总线周期只能访问16位数据,如果理器使用stw或者lwz指令访问16位的小端设备内的32位数据,在数据总线上将OP0~1OP2~3依次传递PowerPC的通用寄存器中。

PowerPC理器使用sth或者lhz指令访问16位的小端设备时16位的小端设备将数据的第15~0位,传递PowerPC理器的总线的第0~15位,然后再将数据最终传递给的通用寄存器。里有者会感到困惑,因为为了保证软件的一致性,PowerPC理器使用lhz指令访问16位的小端设备16位寄存器,需要将果保存在通用寄存器的第16~31位,而不是0~15位。究竟PowerPC理器是如何将系统总线0~15位的数据搬移到寄存器的第16~31位中的呢?此我需要lhz指令行分析。

lhz rD,d(rA)

if rA = 0 then b ← 0

else b ← (rA)

EA ← b + EXTS(d)

rD ← (24)0 || MEM(EA, 1)

 

 lhz指令的以上描述得知lhz指令将来自数据总线上的OP0OP1直接存入寄存器的第16~31位,而将第0~15位直接清零。

PowerPC理器使用stb或者lbz指令访问8位的小端设备时8位的小端设备将数据的第7~0位,传递PowerPC理器的总线的第0~7位,然后再将数据最终传递给的通用寄存器,lbz指令的描述如下所示。

lbz rD,d(rA)

if rA = 0 then b ← 0

else b ← (rA)

EA ← b + EXTS(d)

rD ← (24)0 || MEM(EA, 1)

 

 lhz指令的以上描述得知lhz指令将来自数据总线上的OP0直接存入寄存器的第24~31位,而将第0~23位清零。

描述了大端理器的32位,16位及8位数据总线32位,16位和8位的小端设备进接。如果大端理器的数据总线需要同支持小端设备32位,16位及8位的数据送方式,端模式的理将会更加复杂IC设计设计PCI总线桥片的候将会遇到类问题,此时设计将使用多路总线开关来解决问题。端模式问题的解决需要硬件协调处理,并在指令集上加以支持。于小端理器而言,需要使用转换的方法实现大小端模式的匹配;于大端理器而言,在外部数据总线与小端外要考数据总线连接的拓扑构。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值