【问题标题】:Reading a structure of 32bits pointers in a 64bit processor在 64 位处理器中读取 32 位指针的结构
【发布时间】:2019-10-19 12:30:58
【问题描述】:

将定义结构中的 32 位指针传递给新的 ARM 64 位处理器

试图从使用 32 位指针结构的旧代码中读取,该结构在另一块硬件中的 32 位处理器中创建,该结构在使用 64 位指针的 64 位处理器的公共内存区域中传递。

struct _32bit_addr_ptr 
{
 unsigned int *addr1;
 unsigned int *addr2;
 unsigned int *addr3;
}test;
test.addr1 = 0x12345678;
test.addr2 = 0x23456781;
test.addr3 = 0x34567812;

所以数据看起来像这样。
大端的数据块看起来像:

1234 5678 2345 6781 3456 7812  

如果我在 64 位指针中使用相同的结构,那么每个地址当然会使用 8 个字节,并且不会给出正确的结果。

有没有办法在结构中定义64位处理器中的结构,而不必使用不使用指针的结构和结构外的强制转换来翻译它?

struct _32bit_address
{
 unsigned int addr_value1;
 unsigned int addr_value2;
 unsigned int addr_value3;
}test2;

unsigned long long Addr_ptr = (unsigned long long *)(test2.addr_value1)

【问题讨论】:

  • 您有一个公共内存区域同时被一个 32 位处理器和一个 64 位处理器访问?还是说要将原始 32 位代码移植到单独的 64 位硬件?

标签: c pointers arm 32bit-64bit


【解决方案1】:

指针应与寻址区域一样宽,因此在您的情况下它们必须是 64 位的。

但是,如果这些结构是由某个例程动态生成的,您可以尝试将它们转换为 64 位基址的偏移量,如果偏移量小于 65536,则可以是 32 位或更好的 16 位偏移量。

您必须同时修改地址生成器和使用这些结构的地址生成器。

其他任何事情都是不可能的。

要么使用 64 位指针,要么进行大量修改。

【讨论】:

  • 添加 ... 地址/偏移量可能只是数组中的索引。在这种情况下处理原始地址就像是自找麻烦。
猜你喜欢
  • 2013-01-11
  • 2011-04-19
  • 2010-09-19
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 2013-02-23
  • 2011-04-28
相关资源
最近更新 更多