PowerPC 604上的整数对齐和字边界规则

PowerPC 604上的整数对齐和字边界规则,c,alignment,abi,powerpc,word-boundary,C,Alignment,Abi,Powerpc,Word Boundary,我们正在用嵌入式C编写实时软件 下面是我的两位同事之间的对话。 我很难理解他们在说什么 员工1: 在PPC体系结构中,整数对齐必须遵循字边界吗? 这与指针堆栈数学/比较是否正确有关 更好地用作转换为整数指针,而不是字符指针。如果 PPC保证字对齐,然后看到不一致的指针值 单词对齐似乎是一个额外的可检查的红旗, 而字符指针本质上可以是奇数地址值3/4 当时…我突然想到…我是不是完全偏离了方向 员工2: 只有浮点值必须位于4字节对齐的内存地址上。所有其他值没有此要求。这就是为什么我们有 解析网络数据

我们正在用嵌入式C编写实时软件

下面是我的两位同事之间的对话。 我很难理解他们在说什么

员工1:

在PPC体系结构中,整数对齐必须遵循字边界吗? 这与指针堆栈数学/比较是否正确有关 更好地用作转换为整数指针,而不是字符指针。如果 PPC保证字对齐,然后看到不一致的指针值 单词对齐似乎是一个额外的可检查的红旗, 而字符指针本质上可以是奇数地址值3/4 当时…我突然想到…我是不是完全偏离了方向

员工2:

只有浮点值必须位于4字节对齐的内存地址上。所有其他值没有此要求。这就是为什么我们有 解析网络数据包时进行4字节对齐检查(可在 数据包中的任何字节偏移量(发送时)。单词对齐不正确 另有保证

员工1:

我可能没有令人满意地陈述我的问题。在PPC中 架构指针通常应该有单词边界值 除非它们指向字符向量中的值。这个 体系结构尽一切努力将所有非向量值与word对齐 边界。这允许进行额外的损坏检查,以便 如果指针值**不在四字节边界上且不指向 对于压缩结构中的元素,则可能意味着数据已被 腐败…这是我唯一的观点

员工2:

我想你误解了我的回答。除非他们改变它,否则 很可能是真的,事实并非如此。单词对齐不正确 保证和检查对字对齐告诉我们什么。这个 这样就不可能进行腐败检查。我特意看了看 这在几年前的旧文档中有所体现,而且 本来可以改变的。不过,我们需要找到这方面的证据。这个 仅保证放置在对齐字上的数据类型 内存地址是浮点数,它是一个编译器选项,而不是一个 架构需求

员工1:

如果你想看,我有“证据”。除非数据是 显式压缩或是它将驻留在 PPC上以[0,4,8,c]结尾的地址

我很困惑。矢量?它们必须引用数组。 这些信息中有多少是有意义的,有多少是可疑的

数据对齐和单词边界的规则是什么

他们想确定什么

我很困惑。矢量?它们必须引用数组

通过“字符向量”,说话人似乎指的是连续的
字符序列
/
无符号字符
。这可能对应于一个C数组,但我怀疑他使用术语“vector”是为了认识到这样一个事实,即任何连续内存块都可以被视为一个连续的
char
,并且
char*
可以指向这样一个序列中的任何
char

数据对齐和单词边界的规则是什么

它们随机器结构的不同而不同。这与C程序的关系是C实现的一个方面。在“托管”环境中,这是操作系统“应用程序二进制接口”(ABI)的一个方面,但对于嵌入式系统,您可能使用“独立的”C实现,在这种情况下,ABI并不是一个真正的东西——只有C实现本身

他们想确定什么

考虑以下代码:

#include <stdint.h>

_Bool is_word_aligned(int anyint) {
    return (((uintptr_t) &anyint) % sizeof(int) == 0);
}
#包括
_布尔字对齐(int-anyint){
返回(((uintpttr\u t)&anyint)%sizeof(int)==0);
}
所讨论的主要问题大致相当于这个问题:“函数
是否会返回错误的结果?”。部分讨论假设系统的自然字长为4字节,但我将字长改为
sizeof(int)
;这种对应关系是32位系统的典型特征,但在任何地方都不能保证。“字号”不是C的概念

我还假设将指针值强制转换为整数类型会在进程的地址空间中产生相应的数字地址;这也是典型的,但不能保证。尽管如此,讨论者似乎也在做出这样的假设,否则在C语言中就没有办法对他们正在讨论的地址进行测试

双方承认,
char*
可以指向任何地址。如果
char
对应于最小的可寻址存储单元,那么这就是C的规范,这也是典型的,但不能保证。这两名员工似乎在讨论执行内部一致性检查的现有代码。现有代码似乎执行从某个指针类型到
char*
的显式转换,然后使用指针算法来寻址指向对象的各个字节。员工1建议将强制转换改为
int*
,并假设如果机器体系结构和C实现要求
int
s与单词对齐,则代码可以将其添加为验证检查

这些信息中有多少是有意义的,有多少是可疑的

只要提供了任何信息,这些信息都是可信的。雇员1的建议是否合理是另一个问题。Employee 2辩称,事实并非如此,因为大多数值不需要在底层机器架构上进行字对齐。这似乎是一个相当有力的论点。员工1观察
int a;

char c;

static unsigned short s_us;

char* ptr = (char*)malloc(50);