
iOS पर Linux शेल चलाने का एक प्रोजेक्ट, जो यूज़रमोड x86 एमुलेशन और सिस्कॉल अनुवाद का उपयोग करता है।
प्रोजेक्ट की वर्तमान स्थिति के लिए, issues टैब और कमिट लॉग देखें।
इस प्रोजेक्ट में एक git सबमॉड्यूल है, क्लोन करते समय --recurse-submodules का उपयोग करना सुनिश्चित करें या क्लोन करने के बाद git submodule update --init चलाएं।
प्रोजेक्ट बनाने के लिए आपको इन चीज़ों की आवश्यकता होगी:
pip3 install meson)brew install llvm, linux पर, sudo apt install clang lld या sudo pacman -S clang lld या जो भी)sudo apt install libsqlite3-dev)brew install libarchive, sudo port install libarchive, sudo apt install libarchive-dev) TODO: इस निर्भरता को बंडल करेंXcode में प्रोजेक्ट खोलें, iSH.xcconfig खोलें, और ROOT_BUNDLE_IDENTIFIER को किसी अद्वितीय मान में बदलें। आपको प्रोजेक्ट (टार्गेट नहीं!) बिल्ड सेटिंग्स में डेवलपमेंट टीम ID को भी अपडेट करना होगा। फिर Run पर क्लिक करें। ऐसी स्क्रिप्ट हैं जो बाकी सब कुछ स्वचालित रूप से कर देंगी। यदि आपको कोई समस्या आती है, तो एक issue खोलें और मैं मदद करने का प्रयास करूंगा।
अपना वातावरण सेट करने के लिए, प्रोजेक्ट में cd करें और meson build चलाएँ ताकि build निर्देशिका में एक बिल्ड डायरेक्टरी बने। फिर build डायरेक्टरी में cd करें और ninja चलाएँ।
एक सेल्फ-कंटेंड Alpine linux फाइलसिस्टम सेट करने के लिए, Alpine वेबसाइट से i386 के लिए Alpine minirootfs tarball डाउनलोड करें और ./tools/fakefsify चलाएँ, जिसमें पहला आर्गुमेंट minirootfs tarball और दूसरा आर्गुमेंट आउटपुट डायरेक्टरी का नाम हो। फिर आप Alpine फाइलसिस्टम के अंदर ./ish -f alpine /bin/sh के साथ चीज़ें चला सकते हैं, यह मानते हुए कि आउटपुट डायरेक्टरी का नाम alpine है। यदि tools/fakefsify आपकी build डायरेक्टरी में मौजूद नहीं है, तो हो सकता है कि वह आपके सिस्टम पर libarchive नहीं ढूँढ पाया (इसे इंस्टॉल करने के तरीकों के लिए ऊपर देखें)।
आप ish को tools/ptraceomatic से बदल सकते हैं ताकि प्रोग्राम को वास्तविक प्रक्रिया में चलाया जा सके और सिंगल स्टेप करके प्रत्येक चरण पर रजिस्टरों की तुलना की जा सके। मैं इसका उपयोग डीबगिंग के लिए करता हूँ। इसके लिए 64-bit Linux 4.11 या बाद का वर्शन आवश्यक है।
iSH में कई लॉगिंग चैनल हैं जिन्हें बिल्ड समय पर सक्षम किया जा सकता है। डिफ़ॉल्ट रूप से, सभी अक्षम हैं। उन्हें सक्षम करने के लिए:
ISH_LOG सेटिंग को लॉग चैनलों की स्पेस-सेपरेटेड सूची पर सेट करें।meson configure -Dlog="<लॉग चैनलों की स्पेस-सेपरेटेड सूची>" चलाएँ।उपलब्ध चैनल:
strace: सबसे उपयोगी चैनल, लगभग हर सिस्टम कॉल के पैरामीटर और रिटर्न वैल्यू को लॉग करता है।instr: एमुलेटर द्वारा निष्पादित प्रत्येक निर्देश को लॉग करता है। यह चीज़ों को बहुत धीमा कर देता है।verbose: डीबग लॉग जो किसी अन्य श्रेणी में फिट नहीं होते।DEFAULT_CHANNEL के लिए grep करें।संभवतः iSH के हिस्से के रूप में मैंने जो सबसे दिलचस्प चीज़ लिखी है, वह इंटरप्रेटर है। यह JIT नहीं है क्योंकि यह मशीन कोड को लक्षित नहीं करता है। इसके बजाय यह गैजेट्स नामक फ़ंक्शंस के पॉइंटर्स की एक सरणी उत्पन्न करता है, और प्रत्येक गैजेट अगले फ़ंक्शन के लिए टेलकॉल के साथ समाप्त होता है; कुछ Forth इंटरप्रेटर्स द्वारा उपयोग की जाने वाली थ्रेडेड कोड तकनीक की तरह। परिणामस्वरूप सरल स्विच डिस्पैच का उपयोग करने वाले एमुलेशन की तुलना में लगभग 3-5x की गति वृद्धि होती है।
दुर्भाग्य से, मैंने लगभग सभी गैजेट्स को असेंबली भाषा में लिखने का निर्णय लिया। यह प्रदर्शन के दृष्टिकोण से शायद एक अच्छा निर्णय था (हालाँकि मुझे कभी पक्का पता नहीं चलेगा), लेकिन पठनीयता, रखरखाव और मेरी विवेकशीलता के दृष्टिकोण से एक भयानक निर्णय था। कंपाइलर/असेंबलर/लिंकर से मुझे जो बकवास सहनी पड़ी है, वह पागल कर देने वाली है। ऐसा लगता है जैसे इसमें कोई राक्षस है जो सुनिश्चित करता है कि मेरा कोड पर्याप्त रूप से विकृत हो, और यदि नहीं, तो यह बेवकूफी भरे कारण बनाता है कि इसे कंपाइल क्यों नहीं होना चाहिए। इस कोड को लिखते समय विवेकशील बने रहने के लिए, मुझे कोड संरचना और नामकरण में सर्वोत्तम प्रथाओं को अनदेखा करना पड़ा। आपको ss और s और a जैसे वर्णनात्मक नामों वाले मैक्रोज़ और वेरिएबल मिलेंगे। असेंबलर मैक्रोज़ अविश्वसनीय रूप से नेस्टेड हैं। और सबसे बढ़कर, लगभग कोई टिप्पणी नहीं है।
तो एक चेतावनी: इस कोड के लंबे समय तक संपर्क में रहने से विवेक की हानि, GAS मैक्रोज़ और लिंकर एरर के बारे में बुरे सपने, या अन्य कोई भी दुर्बल करने वाले दुष्प्रभाव हो सकते हैं। यह कोड कैलिफोर्निया राज्य द्वारा कैंसर, जन्म दोष और प्रजनन हानि का कारण बनने के लिए जाना जाता है।