
Минимальная архитектура машины с бэкендом компилятора LLVM, портом для Linux и виртуальной машиной для создания самодостаточных программных капсул, которые остаются работоспособными неограниченно долго без сложных зависимостей.
Это корневой репозиторий Eternal Software Initiative.
ESI определяет минимальную архитектуру машины (основанную на модификации OISC Subleq), которая настолько проста, что её полную спецификацию можно записать на салфетке. Затем мы предоставляем бэкенд компилятора 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
Для сборки виртуальной машины ESI вам потребуется SDL3. Установите, например, с помощью 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.
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
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
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
cd ../runtime
./build_and_install_runtime.sh
./build_libcxx.sh
ninja -C ./libcxx install
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
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 \
AR=../llvm-project/build/bin/llvm-ar \
NM=../llvm-project/build/bin/llvm-nm \
OBJCOPY=../llvm-project/build/bin/llvm-objcopy \
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 \
OBJCOPY=../llvm-project/build/bin/llvm-objcopy
cd ..
python3 tools/make_boot_image.py --stack-size 536870912 linux/vmlinux
./vm/vm linux/vmlinux.bootimage
Введите exit, когда закончите, чтобы завершить работу виртуальной машины.
Стандартный рабочий процесс кросс-компиляции. Для быстрого старта мы предоставляем вспомогательный скрипт (clang_userspace.sh), который настраивает окружение и вызывает clang.
cat << 'EOF' > hello.c
#include <stdio.h>
int main() {
printf("Hello, ESI world!\n");
return 0;
}
EOF
tools/clang_userspace.sh hello.c
cp hello.elf initramfs_root/root
Затем пересоберите initramfs и капсулу:
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
cd ..
python3 tools/make_boot_image.py --stack-size 536870912 linux/vmlinux
Загрузите ВМ:
./vm/vm linux/vmlinux.bootimage
После загрузки Linux:
./hello.elf
Предоставлена для современных разработчиков, чтобы понять архитектуру и инструментарий. Ничто из этого (кроме салфетки) не нужно тому, кто через 1000 лет захочет возродить капсулу и запустить находящееся внутри ПО.
Если вы портировали виртуальную машину ESI на новую платформу, сообщите нам об этом, создав Issue, и мы добавим его в этот список.
Минифицированная версия виртуальной машины ESI (в 366 байтах C) стала победителем 29-го конкурса IOCCC.