
न्यूनतम मशीन आर्किटेक्चर जिसमें LLVM कंपाइलर बैकएंड, Linux पोर्ट, और वर्चुअल मशीन है, जो स्व-निहित सॉफ्टवेयर कैप्सूल बनाने के लिए है जो जटिल निर्भरताओं के बिना अनिश्चित काल तक चलने योग्य रहते हैं।
यह Eternal Software Initiative के लिए रूट रिपॉजिटरी है।
ESI एक न्यूनतम मशीन आर्किटेक्चर (Subleq OISC के एक संशोधन पर आधारित) को परिभाषित करता है जो इतना सरल है कि इसका पूर्ण विनिर्देश एक नैपकिन पर लिखा जा सकता है। फिर हम इस आर्किटेक्चर के लिए एक LLVM कंपाइलर बैकएंड, Linux का एक पोर्ट, C/C++ रनटाइम लाइब्रेरीज़ के पोर्ट, और अन्य टूल्स (जिसमें ~50 लाइनों के C में एक संदर्भ वर्चुअल मशीन इम्प्लीमेंटेशन शामिल है) प्रदान करते हैं, जो मौजूदा सॉफ़्टवेयर से एक स्व-निहित 'कैप्सूल' बनाने और चलाने के लिए आवश्यक हैं।
इस सबका उद्देश्य क्या है? आज के सॉफ़्टवेयर को चलाने के लिए मालिकाना और अपूर्ण रूप से प्रलेखित हार्डवेयर के ऊपर निर्भरताओं का एक जटिल स्टैक (कंपाइलर, लाइब्रेरीज़, फ्रेमवर्क, OS) आवश्यक है, जिससे यह सुनिश्चित करना बहुत कठिन हो जाता है कि आज का सॉफ़्टवेयर भविष्य में भी संचालित होता रहेगा। 'बिट रॉट' की यह समस्या किसी भी ऐसे व्यक्ति को भली-भांति ज्ञात है जो वर्षों या दशकों की अवधि में लीगेसी सॉफ़्टवेयर का रखरखाव करता है, लेकिन अब कल्पना करें कि 1,000 वर्ष बाद का एक इतिहासकार 21वीं सदी के जीवन को समझने का प्रयास कर रहा है, जिसका बहुत सारा हिस्सा सॉफ़्टवेयर के माध्यम से अनुभव किया जाता है। भले ही आज के सॉफ़्टवेयर बाइनरीज़ संरक्षित हों, यह कल्पना करना दूर की बात है कि वे बाइनरीज़ अभी भी चलाने योग्य होंगी। QEMU जैसे एमुलेटर इस समस्या को इधर-उधर तो करते हैं लेकिन हल नहीं करते: उनमें भी सॉफ़्टवेयर और हार्डवेयर निर्भरताओं का समान रूप से जटिल स्टैक होता है, और इसलिए वे भी दूर के भविष्य में चलाने योग्य नहीं होंगे।
ESI इस समस्या को इस प्रकार हल करता है: (1) एक ऐसी आर्किटेक्चर को परिभाषित करके जो नैपकिन पर लिखने के लिए पर्याप्त सरल है लेकिन किसी भी सॉफ़्टवेयर को कुशलता से निरूपित करने के लिए पर्याप्त शक्तिशाली है, और जिसके लिए किसी मालिकाना हार्डवेयर, सॉफ़्टवेयर, फ्रेमवर्क इत्यादि के ज्ञान की आवश्यकता नहीं होती, और (2) किसी भी मौजूदा सॉफ़्टवेयर को इस आर्किटेक्चर के लिए एक स्व-निहित 'कैप्सूल' में कंपाइल करने के लिए एक टूलचेन को लागू करके। यह सुनिश्चित करता है कि, बशर्ते कैप्सूल बाइनरी और नैपकिन निर्देश संरक्षित रहें, सॉफ़्टवेयर को वर्तमान दिन की कंप्यूटिंग प्रणालियों के किसी भी ज्ञान को माने बिना दूर के भविष्य में पुनर्जीवित और अनुभव किया जा सकता है।
इस रिपॉजिटरी में अपनी स्वयं की ESI मशीन बनाने और चलाने, तथा मौजूदा सॉफ़्टवेयर से ESI 'कैप्सूल' बनाने के लिए आवश्यक सब कुछ शामिल है।
ESI के मिशन के बारे में अधिक जानकारी के लिए देखें: https://www.eternal-software.org
इस रिपॉजिटरी में सबमॉड्यूल के रूप में LLVM टूलचेन, Linux कर्नेल, uClibc-ng, और Busybox के ESI फोर्क्स शामिल हैं। इन सभी को एक साथ चेक आउट किया जाना चाहिए।
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
समाप्त होने पर VM को समाप्त करने के लिए 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/vm linux/vmlinux.bootimage
एक बार Linux बूट हो जाने पर:
./hello.elf
आर्किटेक्चर और टूलचेन को समझने के लिए आज के डेवलपर्स के लिए प्रदान किया गया। 1,000 वर्ष बाद किसी के लिए कैप्सूल को पुनर्जीवित करने और उसके भीतर के सॉफ़्टवेयर को चलाने के लिए इसमें से कुछ भी (नैपकिन को छोड़कर) आवश्यक नहीं है।