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

时间:2016-05-17 12:44:29

标签: c alignment abi powerpc word-boundary

我们正在嵌入式C中为PowerPC 604编写实时软件。

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

员工1:

  

在PPC架构中,整数对齐必须遵循字边界吗?   这与指针堆栈数学/比较是否可能有关   更好地作为强制转换为整数指针而不是char指针。如果   PPC保证字对齐,然后看到指针值不是   单词对齐似乎是一个额外的可检查红旗,   而char指针本质上可以是奇数地址值3/4   当时...只是一个想到我的想法......我完全偏离了基地吗?

员工2:

  

只有浮点值必须在4字节对齐的内存地址上,   所有其他值都没有此要求。这就是我们拥有的原因   解析网络数据包时可以检查4字节对齐(可以是   发送的数据包中的任何字节偏移量)。 WORD对齐不是   保证不然。

员工1:

  

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

员工2:

  

我认为你误解了我的答案。除非他们改变了,哪个   很可能是真的,事实并非如此。 WORD对齐不是   保证和WORD对齐检查告诉我们什么。该   这种方式不可能进行腐败检查。我特意看了一下   在几年前的旧文档中,这肯定是   本可以改变它。我们需要找到证据。该   只保证放在单词对齐的数据类型   内存地址是浮点数,它是一个编译器选项,而不是   架构要求。

员工1:

  

我已经得到了证据"如果你想看到它。除非数据是   显式打包或是一个char矢量索引,它将驻留在一个   地址以PPC上的[0,4,8,c]结尾。

我很困惑。向量?它们必须指的是阵列 这些信息中有多少是有意义的,有多少是值得怀疑的?

数据对齐和字边界有哪些规则?
他们试图确定什么?

2 个答案:

答案 0 :(得分:1)

  

我很困惑。向量?他们必须指数组。

通过"字符矢量",说话者似乎指的是char / unsigned char的连续序列。这可能对应一个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);
}

正在讨论的主要问题大致相当于这个问题:&#34;函数is_word_aligned()是否会返回错误的结果?&#34;。讨论的部分内容是系统的自然字大小为4字节,但我将字大小写为sizeof(int);这种对应关系是32位系统的典型,但不保证任何地方。 &#34;单词大小&#34;不是C概念。

我还假设将指针值转换为整数类型会在进程的地址空间中生成相应的数字地址;这也是典型的,但不能保证。然而,讨论者似乎也在做出这样的假设,因为否则C在他们所谈论的地址上没有办法进行各种测试。

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

  

这些信息中有多少是有意义的,有多少是值得怀疑的?

如果出现任何信息,则该信息似乎是合理的。员工1的建议是否合理是一个不同的问题。员工2认为,并非基于大多数值不需要在底层机器架构上进行字对齐。这似乎是一个非常有力的论据。员工1观察到在实践中,C实现确实对齐字边界上的存储,但很难知道这是否可以作为绝对规则来依赖。此外,如果转换前的原始指针不是int *,那么没有特别的理由将其作为无效的标志,将指针转换为int *会产生一个结果与字对齐的地址不对应。

答案 1 :(得分:0)

以最简单的形式,以下内容适用于运行WindRiver C代码的PPC e604处理器。

代码中任何已定义的变量,例如

int a;

char c;

static unsigned short s_us;

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

每个变量的地址和ptr的值将是一个字边界(特定于系统体系结构的字大小)。

历史原因是,当我开始使用计算机并且我们将恐龙带到办公室时(我们实际上有真正的办公室)许多系统架构都要求所有内存访问都在字边界上,如果是尝试访问奇数地址的内存。要访问奇数寻址数据,需要将完整字加载到寄存器中,然后移出。

现代的原因是效率。仍有一些架构在访问非字对齐的数据时会降低性能。 PPC就是这样一种架构。