struct Message
{
short opcode;
char subfield;
long message_length;
char version;
short destination_processor;
}message;
用这样一个结构来传递消息貌似非常方便, 但也引发了这样一个问题: 若这两种不同的CPU对该结构的定义不一样, 两者就会对消息有不同的理解。 有可能导致二义性。 会引发二义性的有这两个方面:
1.内存地址对齐
2.大小端定义
本文先介绍内存地址对齐和大小端的概念, 再回头来看这个例子就豁然开朗了。
内存地址对齐
洋名叫做" Byte Alignment"。
大部分16位和32位的CPU不允许将字或者长字存储到内存中的任意地址。 比如Motorola 68000不允许将16位的字存储到奇数地址中, 将一个16位的字写到奇数地址将引发异常。
实际上, 对于c中的字节组织, 有这样的对齐规则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
不同CPU的对其规则可能不同, 请参考手册。
为什么会有上述的限制呢? 理解了内存组织, 就会清楚了
CPU通过地址总线来存取内存中的数据,32位的CPU的地址总线宽度既为32位置, 标为A[0:31]。 在一个总线周期内,CPU从内存读/写32位。 但是CPU只能在能够被4整除的地址进行内存访问,这是因为: 32位CPU不使用地址总线的A1和A2(比如ARM,它的A[0:1]用于字节选择, 用于逻辑控制, 而不和存储器相连, 存储器连接到A[2:31])。访问内存的最小单位是字节(byte), A0和A1不使用, 那么对于地址来说, 最低两位是无效的, 所以它只能识别能被4整除的地址了。 在4字节中,通过A0和A1确定某一个字节。
再看看刚才的message结构, 你想想它占了多少字节? 别想当然的以为是10个字节。 实际上它占了12个字节。 不信?
用sizeof(message)看吧。 对于结构体, 编译器会针对起中的元素添加"pad"以满足字节对齐规则。
message会被编译器改为下面的形式:
struct Message
{
short opcode;
char subfield;
char pad1; // Pad to start the long word at a 4
// byte boundary
long message_length;
char version;
char pad2; // Pad to start a short at a 2 byte boundary
short destination_processor;
char pad3[4]; // Pad to align the complete structure to a 16
// byte boundary
};
如果不同的编译器采用不同的对齐规则, 对传递message可就麻烦了。
大端(Big Endian)与小端(Little Endian)
Byte Endian是指字节在内存中的组织,所以也称它为Byte Ordering。
对于数据中跨越多个字节的对象, 我们必须为它建立这样的约定:
(1) 它的地址是多少?
(2) 它的字节在内存中是如何组织的?
针对第一个问题,有这样的解释:
对于跨越多个字节的对象,一般它所占的字节都是连续的, 它的地址等于它所占字节最低地址。(链表可能是个例外, 但链表的地址可看作链表头的地址)。
比如: int x, 它的地址为0x100。 那么它占据了内存中的Ox100, 0x101, 0x102, 0x103这四个字节。
上面只是内存字节组织的一种情况: 多字节对象在内存中的组织有一般有两种约定。 考虑一个W位的整数。 它的各位表达如下:
[Xw-1, Xw-2, ... , X1, X0]
它的MSB (Most Significant Byte, 最高有效字节)为[Xw-1, Xw-2, ... Xw-8]; LSB (Least Significant Byte, 最低有效字节)为 [X7,X6,..., X0]。 其余的字节位于MSB, LSB之间。
LSB和MSB谁位于内存的最低地址, 即谁代表该对象的地址? 这就引出了大端(Big Endian)与小端(Little Endian)的问题。
如果LSB在MSB前面, 既LSB是低地址, 则该机器是小端; 反之则是大端。 DEC (Digital Equipment Corporation, 现在是Compaq公司的一部分)和Intel的机器一般采用小端。 IBM, Motorola, Sun的机器一般采用大端。 当然, 这不代表所有情况。 有的CPU即能工作于小端, 又能工作于大端, 比如ARM, PowerPC, Alpha。 具体情形参考处理器手册。
举个例子来说名大小端: 比如一个int x, 地址为0x100, 它的值为0x1234567。 则它所占据的0x100, 0x101, 0x102, 0x103地址组织如下图:
0x01234567的MSB为0x01, LSB为0x67。 0x01在低地址(或理解为"MSB出现在LSB前面,因为这里讨论的地址都是递增的), 则为大端; 0x67在低地址则为小端。
认清这样一个事实: C中的数据类型都是从内存的低地址向高地址扩展,取址运算"&"都是取低地址。
两个测试Bit Endian的小程序:
method_1
#i nclude <stdio.h>
int main(int argc, char *argv[])
{
int c = 1;
if ((*(char *)&c) == 1)
{
printf("little endian\n");
}
else
printf("big endian");
return 0;
}
int c 在内存中的表达为: 0x00000001。 (这里假设int为4字节)。 用char可以截取一个字节。 LSB为0x01, 若它出现在c的低地址, 则为小端。
method_2
#i nclude <stdio.h>
int main(void)
{
/* Each component to a union type is allocated storage at the
beginning of the union */
union
{
short n;
char c[sizeof(short)];
}un;
un.n = 0x0102;
if ((un.c[0] == 1 && un.c[1] == 2))
printf("big endian\n");
else if ((un.c[0] == 2 && un.c[1] == 1))
printf("little endian\n");
else
printf("error!\n");
return 0;
}
union中元素的起始地址都是相同的——位于联合的开始。 用char来截取感兴趣的字节。
区分大端与小端有什么用呢? 如果两个不同Endian的机器进行通信时, 就有必要区分了。
字节对齐 thieven 发表于 2005-12-8 21:26:00 |
|
|
相关推荐
常数存储器在某些情况下可以用来加速计算,但使用时需要注意其大小限制和正确地声明与访问。 6. **纹理存储器(Texture Memory)**:纹理存储器专门用于处理图像数据,提供了额外的缓存机制和过滤选项。它适用于...
存储器寻址涉及到字节顺序(大端或小端)和对齐策略。对齐数据在存储器中的位置有助于减少硬件复杂性,提高运算效率,因为处理器在访问对齐的数据时通常能更快地完成操作。 寻址方式包括寄存器寻址、立即数寻址、...
文本对齐方式有左对齐、右对齐、居中、两端对齐和分散对齐。特殊字符如大于号和小于号可以通过特殊符号插入。视图模式包括页面视图、阅读版式视图等,用于不同用途的文档查看。段落缩进和制表符可以通过标尺进行调整...
该控制器支持小端和大端模式,这取决于外部ENDIAN引脚的状态,用户可以通过此引脚选择适合的数据对齐方式。处理器在复位时,默认根据ENDIAN引脚的状态来确定字节顺序,当ENDIAN为L时,系统工作在大端模式,反之则...
5. Word文档中的段落对齐方式包括左对齐、右对齐、居中、分散对齐和两端对齐。 6. Windows操作系统通过资源管理器来管理计算机的软硬件资源。 7. 许多系统设置功能集中在Windows XP的控制面板中。 8. 在Word中,通过...
14. 插入菜单用于绘制文本框,Word启动后默认打开文档1,段落对齐方式包括左对齐、居中、右对齐、两端对齐和分散对齐。 15. 页面视图可以显示图片和页眉页脚,打印预览则模拟实际打印效果,页面设置命令用于设定打印...
段落对齐方式包括左对齐、右对齐、居中、两端对齐和分散对齐,其中两端对齐是默认设置。添加边框和选定操作对象是编辑文档的基本操作。 9. **表格处理**:在Word中,可以创建、编辑表格,单击单元格可选定,单元格...
结构变量`b`的大小取决于成员的大小和对齐方式,而变量`i`的存储顺序(大端或小端)取决于目标处理器的字节顺序。 总结来说,这份学习资料提供了一个深入理解计算机体系结构的起点,包括其基本组件、存储组织、数据...
Word2010支持多种段落对齐方式,如右对齐、分散对齐、居中和两端对齐。 【Word2010页面布局】 页面布局菜单允许用户设置页边距、分栏等格式。 【Word2010字数统计】 Word2010具有字数统计功能,可以在“审阅”选项...
14. Word 2010的段落对齐方式包括右对齐、分散对齐、居中和两端对齐。 15. 十进制36转化为二进制是100100。 16. Word 2010具有文档字数统计功能。 17. 第四代计算机的主存储器使用半导体存储器。 18. 字符"A"的...
3. 文本对齐方式有两端对齐、居中对齐、右对齐和分散对齐。 4. 缩进类型包括首行缩进、悬挂缩进、左缩进和右缩进。 5. 在Excel中,工作表标签位于底部,用于切换不同工作表。 6. 数据筛选功能包括自动筛选和高级筛选...
小端存储器组织将高有效字节存放在低地址,低有效字节存放在高地址,而大端存储器组织则相反。数据边界对齐是指数据结构成员在内存中按照特定的对齐规则排列,以优化访问效率,通常与处理器架构和编译器设置有关。...
- 段落对齐:Word 2010支持右对齐、分散对齐、居中、两端对齐等多种对齐方式。 - 数制转换:十进制36转化为二进制是100100。 - 字数统计:Word 2010具备字数统计功能。 - 第四代计算机存储器:主要使用半导体存储器...
30. **文本对齐方式**:Word提供了五种对齐方式,包括居中对齐、两端对齐、分散对齐、左对齐和右对齐。 **问答题解析:** 1. **绘制斜线表头步骤**:通常需要在表格的单元格中点击右键,选择“边框和底纹”,然后在...
这种存储方式对于处理多字节数据类型时的数据对齐和访问效率有着直接影响。 ARM的存储体系是一个层次化的结构,类似于金字塔形。从顶端开始,有寄存器、片上Cache、写缓存、TCM(紧耦合存储器)、片内SRAM,然后是...
本文将深入探讨简答题中涉及的一些核心概念,包括大小端对齐、指令周期、机器周期和时钟周期、总线判优、程序访问的局部性、指令和数据的区分,以及I/O编址方式。 1. 大小端对齐: 计算机中的数据存储方式有两种,...
10. **存储器对齐**:小端对齐模式下,低地址存储低位字节,高地址存储高位字节。4个连续存储单元存储32位数据,按照小端模式解析。 11. **标准移码**:标准移码是补码的所有位取反,不包括符号位。 12. **IEEE754...
14. **段落对齐**:PowerPoint2003支持左对齐、居中、右对齐、两端对齐和分散对齐等多种对齐方式。 15. **多媒体技术应用**:多媒体技术广泛应用于娱乐、商业、信息和教育领域。 16. **裸机概念**:“裸机”指的是...