【问题标题】:How does this code align pointer to 64-bit boundary?此代码如何将指针对齐到 64 位边界?
【发布时间】:2011-02-09 01:40:04
【问题描述】:

我想知道这段代码如何将指针对齐到 64 位边界?我在 uboot cpu/mpc85xx/ether_fcc.c 中找到了这段代码。这里底层以太网控制器要求缓冲区指针与 64 位边界对齐。

uint cbd_bufaddr;
volatile uchar *NetRxPackets[PKTBUFSRX];
cbd_bufaddr = (uint)NetRxPackets[i];

我相信以下检查是强制性的,以确保指针是 64位对齐,但我在uboot代码的任何地方都看不到它。

if (cbd_bufaddr % 8 != 0)
    cbd_bufaddr += 8 - cbd_bufaddr % 8;

如果有人能指出我是否遗漏了一些明显的东西,我将不胜感激?

【问题讨论】:

  • 你还没有指出 NetRxPackets[i] 中的值是从哪里来的,这就是需要对齐的地方。

标签: c memory pointers alignment


【解决方案1】:

原始代码中的任何内容都无法保证对齐。您的第一个代码块只是从NetRxPackets 数组中拉出一个指针并将其粘贴到cbd_bufaddr 中。您提供的代码没有表明该数组内的指针有任何对齐限制。您需要向我们展示初始化该数组的代码,以便我们告诉您更多关于正在发生的事情。

【讨论】:

  • 实际上现在我想起来了,我不确定在 32 位系统上是否需要在 64 位边界上对齐 64 位值。让我拿出规范并澄清一下。
  • 当我查看规范时,我没有看到任何相关内容,这对我来说似乎是正确的。在这种情况下,它是一个指针类型数组,因此它似乎具有原生对齐方式。
  • 实际上是存储在数组中的值需要正确对齐,无论如何 - 数组本身的对齐方式无关紧要。
  • 咖啡馆是对的。为什么这个答案被升级了? OP 的问题是有缺陷的,因为据我们所知,NetRxPackets 中的值已经对齐——比如说,由 malloc 返回,它在许多系统上的双字边界上分配内存。
  • @Jim 和@caf 完全正确;我看到一个不存在的&。让我去修正这个答案。
猜你喜欢
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 2022-06-24
  • 2022-01-15
相关资源
最近更新 更多