Чтение структуры 32-битных указателей в 64-битном процессоре - PullRequest
1 голос
/ 04 июня 2019

Передача 32-битных указателей в определенной структуре на новый 64-битный процессор ARM

Попытка чтения из унаследованного кода, который использует структуру 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)

1 Ответ

1 голос
/ 04 июня 2019

Указатели должны быть такими же широкими, как и область адресации, поэтому в вашем случае они ДОЛЖНЫ быть 64-битными.

Однако, если эти структуры генерируются на лету определенной процедурой, вы можете попробоватьчтобы преобразовать их в смещения в 64-битный базовый адрес, 32-битные или лучше 16-битные смещения, если смещения меньше 65536.

Для этого вам необходимо изменить как генератор адресов, так и те, которые используют эти структуры.

Все остальное просто невозможно.

Либо вы живете с 64-битными указателями, либо вы делаете довольно много изменений вокруг.

...