我有一个 Raspberry Pi 3 Model B,我从 32 位 Raspbian 切换到 64 位 Gentoo Linux,因为我想测试一些 64 位应用程序。现在,我想测试一个以大端顺序访问数据字节的应用程序。我知道我可以通过交换单词中的字节来手动执行此操作。但我的主要问题是如何在 Raspberry Pi 上将字节顺序永久更改为大端,并且可能稍后在所有测试完成后再次切换回小端。任何线索将不胜感激。
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 内核正在执行系统调用。我希望这有助于解决您最初的问题。
这是一个带有大端 Gentoo 的 Raspberry Pi 3 SD 卡映像,供您使用: https ://github.com/zeldin/linux-1/releases