基于 Subleq 单指令集计算机的永恒软件倡议
介绍 这是永恒软件倡议的根仓库。ESI 定义了一种最小的机器架构(基于对 Subleq OISC 的修改),其简洁到可以在餐巾纸上写下完整的规格。我们为此架构提供一个 LLVM 编译器后端,一个 Linux 移植版,C/C++ 运行时库的移植版本以及其他工具(包括一个约 50 行 C 代码实现的参考虚拟机),以便从现有软件构建和运行一个自包含的“胶囊”。 这一切的意义是什么?运行当今软件需要依赖复杂的堆栈(编译器、库、框架、操作系统),建立在专有且文档不完全的硬件之上,使得确保当今软件在未来继续运行异常困难。这个“位腐蚀”的问题是任何维护遗留软件多年或几十年的人都已经非常清楚,但现在想象一下,1000 年后的一位历史学家试图理解 21 世纪的生活,其中许多是通过软件体验的。即使当今的软件二进制文件被保存,但想象那些二进制文件仍然可以运行也是不现实的。像 QEMU 这样的仿真器只是在周围转移这个问题,但并没有解决它:它们也有类似复杂的软件和硬件依赖堆栈,因此在遥远的未来也无法运行。ESI 通过以下方式解决了这个问题: (1) 定义了一种简单到可以在餐巾纸上写下但足够强大以有效表示任何软件的架构,而不需要了解任何专有硬件、软件、框架等;(2) 实现了一个工具链,将任何现有软件编译成适合该架构的自包含“胶囊”。这确保了,只要胶囊二进制文件和餐巾纸指令被保留,软件就可以被复活并在遥远的未来体验,而无需假设对当代计算系统的任何知识。此仓库包含构建和运行您自己的 ESI 机器以及从现有软件构建 ESI “胶囊”所需的一切。有关 ESI 使命的更多信息,请参见:https://www.eternal-software.org 查看本仓库包括,以子模块形式提供的 ESI LLVM 工具链、Linux 内核、uClibc-ng 和 Busybox。您必须一起检查它们。 git clone --recurse-submodules https://github.com/adriancable/eternal 构建虚拟机并尝试 您需要 SDL3 来构建 ESI 虚拟机。使用例如 apt install libsdl3-dev 安装。没有其他依赖项。SDL3 可以轻松替换为任何其他用于写像素和捕捉键盘事件的方式,无论现在还是未来。 cd eternal/vm make xz -d ../capsules/vmlinux.bootimage.xz ./vm ../capsules/vmlinux.bootimage 启动 Linux 后,尝试例如: cd doom ./doom 构建工具链 ESI 工具链应该可以在任何 Linux 系统上轻松构建。我们也在 macOS 上成功构建过,但需要一些修改。确保您已安装并正常运行 gcc、python3、CMake、ninja、flex、bison。首先在检出的 eternal 文件夹中开始。步骤 1:构建 ESI LLVM rm -rf llvm-project/build && mkdir -p llvm-project/build cmake -G Ninja -S llvm-project/llvm -B llvm-project/build -DLLVM_ENABLE_PROJECTS="clang;lld" -DLLVM_BUILD_TOOLS=ON -DLLVM_ENABLE_ASSERTIONS=OFF -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD= "" -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD="Subleq" -DLLVM_DEFAULT_TARGET_TRIPLE="subleq-unknown-linux" -DLLVM_FORCE_VC_REPOSITORY="ESI" -DLLVM_FORCE_VC_REVISION="" cd llvm-project/build ninja llc clang llvm-mc lld llvm-objcopy llvm-ar llvm-ranlib llvm-nm llvm-readelf llvm-strip llvm-objdump 步骤 2:安装 Linux 内核头文件 cd ../../linux make ARCH=subleq \ CC=../llvm-project/build/bin/clang \ LD=../llvm-project/build/bin/ld.lld \ AR=../llvm-project/build/bin/llvm-ar \ NM=../llvm-project/build/bin/llvm-nm \ OBJCOPY=../llvm-project/build/bin/llvm-objcopy \ INSTALL_HDR_PATH=../runtime/sysroot/kernel-headers \ headers_install 步骤 3:构建并安装 ESI C 运行时(uClibc-ng) cd ../uclibc-ng make ARCH=subleq defconfig make ARCH=subleq \ CC=../llvm-project/build/bin/clang \ LD=../llvm-project/build/bin/ld.lld \ AR=../llvm-project/build/bin/llvm-ar \ NM=../llvm-project/build/bin/llvm-nm \ PREFIX=../runtime/sysroot \ STRIPTOOL=../llvm-project/build/bin/llvm-strip \ DEVEL_PREFIX=/ \ install_dev 步骤 4:构建 ESI 核心运行时(CPU、FPU、C++) cd ../runtime ./build_and_install_runtime.sh ./build_libcxx.sh ninja -C ./libcxx install 步骤 5:构建 Busybox cd ../busybox make subleq_defconfig make CC=../llvm-project/build/bin/clang \ AR=../llvm-project/build/bin/llvm-ar \ STRIP=../llvm-project/build/bin/llvm-strip mkdir ../initramfs_root/bin cp busybox ../initramfs_root/bin/busybox 步骤 6:构建 ESI Linux cd ../linux export KBUILD_BUILD_USER="root" export KBUILD_BUILD_HOST="eternal" make ARCH=subleq \ CC=../llvm-project/build/bin/clang \ LD=../llvm-project/build/bin/ld.lld
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡