gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:30:19 27 4
gpt4 key购买 nike

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

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

员工 1:

In the PPC architecture, must integer alignment follow word boundaries? This is related to whether the pointer stack math/comparisons might be better served as cast to integer pointers instead of char pointers. If PPC guarantees word alignment then seeing pointer values that are not word aligned seems it would be an additional check-able red-flag, whereas char pointers could by their nature be odd address values 3/4 of the time...just a thought that came to me...am I totally off-base?

员工 2:

Only floating point values must be on 4-byte aligned memory address. All other values do not have this requirement. This is why we have 4-byte alignment checks when parsing network packets (which can be at any byte offset in the packet as sent). WORD alignment is not guaranteed otherwise.

员工 1:

I probably didn't state my issue satisfactorily. In the PPC architecture pointers should generally have word boundary values unless they are pointing to values in a vector of characters. The architecture makes every effort to align all non-vector values to word boundaries. This allows for an additional corruption check such that if a pointer value is **not on a four byte boundary and does not point to an element in a packed struct then it probably means data has been corrupted...That was my only point.

员工 2:

I think you misunderstood my answer. Unless they changed it, which could very well be true, that it not the case. WORD alignment is not guaranteed and a check against WORD alignment tells us nothing. The corruption check would not be possible this way. I specifically looked this up in the old documentation several years ago, and they certainly could have changed it. We would need to find proof of this though. The only data type that is guaranteed to be placed on a word aligned memory address are floats and it's a compiler option, not an architecture requirement.

员工 1:

I've got "the proof" if you want to see it. unless the data is explicitly packed or is a char vector index it will reside at an address ending in [0,4,8,c] on PPC.

我很困惑。 vector ?他们一定是指数组。这些信息中有多少是有意义的,有多少是有问题的?

数据对齐和字边界的规则是什么?

他们试图确定什么?

最佳答案

I'm very confused. Vector? They must be referring to arrays.

通过“字符 vector ”,说话者似乎指的是 char 的连续序列/unsigned char .这可能对应于一个 C 数组,但我怀疑他使用术语“vector ”是因为认识到 任何 连续内存块都可以被视为 char 的连续序列。 , 那一个 char *可以指向任何 char在这样一个序列中的任何地方。

What are the rules for data alignment and word boundaries?

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

What are they trying to determine?

考虑以下代码:

#include <stdint.h>

_Bool is_word_aligned(int anyint) {
return (((uintptr_t) &anyint) % sizeof(int) == 0);
}

正在讨论的主要问题大致等同于这个问题:“函数 is_word_aligned() 是否会返回错误结果?”。部分讨论假定系统的自然字长为 4 个字节,但我将字长写为 sizeof(int)。 ;这种对应关系是 32 位系统的典型特征,但在任何地方都不能保证。 “字长”不是 C 的概念。

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

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

How much of this information makes sense, and how much of it is questionable?

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

关于c - PowerPC 604 上的整数对齐和字边界规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37276609/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com