RISC-V 的交叉翻译

本文档介绍如何将 RPython 翻译成 RISC-V 64 位后端。

创建 Ubuntu RISC-V 64 位 Chroot

本节介绍如何在 x86 主机上设置 RISC-V 64 位 chroot。如果您想直接在 RISC-V 64 位板上开发,可以跳过本节。

首先,我们必须在主机上安装以下依赖项

  • debootstrap – Debian 工具,用于在目录中创建 Debian/Ubuntu 根文件系统。
  • schroot – 一个 chroot 管理守护进程,帮助我们在 chroot 之间切换。
  • qemu-user-static – 二进制翻译器,允许我们在 x86-64 上运行 RISC-V 64 位可执行文件。
  • binfmt-support – 一个实用程序包,帮助 Linux 内核为 RISC-V 64 位可执行文件调用 qemu-user-static
  • ubuntu-keyring – Ubuntu 存档的公钥。

运行以下命令安装所有这些

sudo apt-get install debootstrap qemu-user-static binfmt-support schroot

# For non-Ubuntu host:
sudo apt-get install ubuntu-keyring

其次,我们必须决定在哪里设置 chroot。在下面的示例中,将使用 /srv/chroot/rv64_ubuntu_24_04

现在,我们通过调用创建根文件系统

sudo mkdir -p /srv/chroot

sudo debootstrap --arch=riscv64 \
    --keyring /usr/share/keyrings/ubuntu-archive-keyring.gpg \
    --include=ubuntu-keyring \
    noble \
    /srv/chroot/rv64_ubuntu_24_04 \
    http://ports.ubuntu.com/ubuntu-ports

# Rename /etc/resolv.conf so that schroot can copy the host resolv.conf
# into chroot.
sudo mv /srv/chroot/rv64_ubuntu_24_04/etc/resolv.conf{,.bak}

第三,创建一个 default_shm schroot 配置文件,允许使用信号量和共享内存

sudo cp /etc/schroot/default /etc/schroot/default_shm

# Uncomment shm fstab lines
sudo sed -i 's_#/run_/run_g' /etc/schroot/default_shm/fstab
sudo sed -i 's_#/dev/shm_/dev/shm_g' /etc/schroot/default_shm/fstab

第四,我们为刚刚创建的根文件系统创建一个 schroot 配置文件。以下命令在 /etc/schroot/chroot.d/rv64_ubuntu_24_04 创建一个配置文件

echo "[rv64_ubuntu_24_04]
description=Ubuntu Noble (24.04) RISC-V
directory=/srv/chroot/rv64_ubuntu_24_04
root-users=$(whoami)
users=$(whoami)
type=directory
profile=default_shm" | sudo tee /etc/schroot/chroot.d/rv64_ubuntu_24_04

现在,您可以使用以下命令测试 chroot

schroot -l

您应该看到输出

chroot:rv64_ubuntu_24_04

您可以使用以下命令进入 chroot

schroot -c rv64_ubuntu_24_04

在 chroot 内部,如果您运行 uname -m,您应该看到 riscv64

$ uname -m
riscv64

您可以使用 -u root 选项以 root 用户身份进入 chroot

schroot -c rv64_ubuntu_24_04 -u root

当您想要将 Debian 软件包安装到 chroot 时,有时可能需要这样做。

构建用于引导的 CPython 2.7

要运行 RPython 工具链,我们需要一个 Python 2.7 实现。本节介绍如何从其源代码构建 CPython 2.7。如果您已经拥有 python2.7,可以跳过本节。

注意

CPython 2.7 不再受支持也不再维护。以下说明基于我在 2024 年初的实验。如有必要,请调整它们。

首先,安装 CPython 的构建依赖项

schroot -c rv64_ubuntu_24_04 -u root -- apt-get install \
    build-essential gcc gdb g++ \
    libbz2-dev libdb-dev libexpat1-dev libffi-dev libgdbm-dev \
    libncursesw5-dev libreadline-dev libsqlite3-dev libssl-dev \
    libtinfo-dev tk-dev zlib1g-dev

其次,创建 CPython 的最终安装目录

schroot -c rv64_ubuntu_24_04 -u root -- mkdir /opt/python2

schroot -c rv64_ubuntu_24_04 -u root -- \
    chown $(whoami):$(whoami) /opt/python2

第三,克隆已修补的 CPython 2.7 存储库

git clone https://github.com/loganchien/cpython27-deprecated -b release_27

cd cpython27-deprecated

第四,在 chroot 中构建 CPython 2.7

schroot -c rv64_ubuntu_24_04
$ ./configure --prefix=/opt/python2 \
              --enable-shared \
              --enable-optimizations \
              --with-system-ffi LDFLAGS="-Wl,-rpath,/opt/python2/lib"

$ make -j8

$ make install -j8

第五,设置 Python 包

$ export PATH=/opt/python2/bin:$PATH

$ python2.7 -mensurepip

$ python2.7 -mpip install -U pip wheel

现在,您应该拥有一个足够用于 RPython 翻译的 CPython 2.7。

使用 RPython 工具链

首先,安装 PyPy 开发的依赖项

schroot -c rv64_ubuntu_24_04 -u root -- apt-get install \
    build-essential pkg-config libbz2-dev libexpat1-dev libffi-dev \
    libgc-dev libgdbm-dev liblzma-dev libncurses5-dev libncursesw5-dev \
    libsqlite3-dev libssl-dev tk-dev zlib1g-dev

此外,要通过所有测试套件,您必须使用 git 构建 PyPy

schroot -c rv64_ubuntu_24_04 -u root -- apt-get install git

其次,安装 PyPy 开发的 Python 包

schroot -c rv64_ubuntu_24_04

$ export PATH=/opt/python2/bin:$PATH

$ cd /path/to/pypy/source/tree

$ python2.7 -mpip install -r requirements.txt

翻译 Hello World 示例

创建一个包含以下内容的 target.py 文件

def main(args):
    print "Hello World"
    return 0

def target(*args):
    return main, None

并调用翻译器

$ python2.7 rpython/bin/rpython -O2 target.py

如果一切正常,这应该会生成一个 RISC-V 64 位二进制文件。在 RISC-V 64 位上运行此二进制文件应该会产生输出 Hello World

翻译 PyPy 解释器

运行以下命令以使用 JIT 编译器翻译完整的 PyPy 解释器

$ cd pypy/goal

$ python2.7 ../../rpython/bin/rpython --opt=jit targetpypystandalone.py

$ PYTHONPATH=../.. ./pypy-c ../../lib_pypy/pypy_tools/build_cffi_imports.py

$ cd ../..

$ python2.7 pypy/tool/release/package.py --archive-name=pypy-VER-PLATFORM