Raspberry Pi 3 Модель B: Как изменить порядок байтов на Big Endian? - PullRequest
2 голосов
/ 30 апреля 2019

У меня Raspberry Pi 3 Model B, и я переключился с 32-битного Raspbian на 64-битный Gentoo Linux, так как хотел протестировать некоторые 64-битные приложения. Теперь я хочу протестировать приложение, которое будет обращаться к байту данных в порядке с прямым порядком байтов. Я знаю, что могу сделать это вручную, меняя байты в слове. Но мой главный вопрос - как навсегда изменить порядок байтов на big-endian на Raspberry Pi и, возможно, позже снова переключиться на little-endian после того, как все тесты будут выполнены. Любые выводы будут с благодарностью.

1 Ответ

0 голосов
/ 02 мая 2019

Я много читал с тех пор, как впервые увидел ваш вопрос, и я отвечаю, что вы не можете запустить приложение Linux с прямым порядком байтов в ядре / дистрибутиве Linux с прямым порядком байтов.Я даже пробовал на моей Armbian системе Orangepi-PC2 aarch64, которая просто отказывалась загружать пример программы, кросс-скомпилированной с использованием ARM'latest big-endian toolchain для aarch64 .Теперь, если вы действительно не хотите преобразовывать свои данные, и если производительность не является проблемой - вероятно, это не потому, что вы хотите выполнять обработку на Raspberry-pi, а не на ПК - я бы предложил вам:

  • установка qemu (на ПК с Linux или виртуальной машиной) для 64-битной платформы с прямым порядком байтов, скажем ppc64,
  • установка кросс-компилятора для ppc64,
  • скомпилируйте вашу программу и обработайте ваши данные.

В системе Ubuntu 18.04 вы должны выполнить следующую команду:

sudo apt-get install gcc-8-powerpc64-linux-gnu qemu

Вот небольшой пример:

Создайте двоичный файл, содержащий 64-битное число 0x1122334455667788:

printf "\x11\x22\x33\x44\x55\x66\x77\x88">  example.dat
hexdump -C example.dat 
00000000  11 22 33 44 55 66 77 88                           |."3DUfw.|
00000008

Создайте эту минимальную программу, предназначенную только для демонстрации:

// example.c

#include <stdio.h>
#include <stdlib.h>

int main()
{
    // demo code only - don't do this in real life...
    unsigned int value = 0;
    FILE* fp = fopen("example.dat", "rb");
    fread(&value, sizeof(value), 1, fp);
    printf("%d\n", value);
}

Скомпилируйте ее:

powerpc64-linux-gnu-gcc-8 -static -o example example.c

Выполните это:

qemu-ppc64 ./example
0x1122334455667788

Та же программа, скомпилированная для x86_64, выдаст 0x8877665544332211, что нормально:

gcc -o example example.c
./example 
0x8877665544332211

qemu-ppc64 эмулирует ppc64,но системные вызовы выполняются вашим ядром Linux x86_64.Я надеюсь, что это поможет решить вашу первоначальную проблему.

...