3

我有一个 Raspberry Pi 3 Model B,我从 32 位 Raspbian 切换到 64 位 Gentoo Linux,因为我想测试一些 64 位应用程序。现在,我想测试一个以大端顺序访问数据字节的应用程序。我知道我可以通过交换单词中的字节来手动执行此操作。但我的主要问题是如何在 Raspberry Pi 上将字节顺序永久更改为大端,并且可能稍后在所有测试完成后再次切换回小端。任何线索将不胜感激。

4

2 回答 2

2

自从第一次看到您的问题以来,我已经阅读了很多内容,我的回答是您无法在 little-endian Linux 内核/发行版上执行 big-endian Linux 应用程序。
我什至在我的基于Armbian的 Orangepi-PC2 aarch64 系统上进行了尝试,它只是拒绝加载使用 ARM'latest big-endian toolchain for aarch64交叉编译的示例程序。

现在,如果您真的不想转换数据,并且性能不是问题 - 这可能不是因为您想在 Raspberry-pi 而不是 PC 上进行处理 - 我建议您:

  • 为大端 64 位平台安装 qemu(在 Linux PC 或虚拟机上),例如 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,但您的 x86_64 linux 内核正在执行系统调用。我希望这有助于解决您最初的问题。

于 2019-05-02T03:11:55.593 回答
1

这是一个带有大端 Gentoo 的 Raspberry Pi 3 SD 卡映像,供您使用: https ://github.com/zeldin/linux-1/releases

于 2021-04-09T09:54:27.240 回答