
مشروع لتشغيل شل لينكس على iOS، باستخدام محاكاة x86 في وضع المستخدم وترجمة استدعاءات النظام.
للحصول على الحالة الحالية للمشروع، تحقق من تبويب القضايا وسجلات الالتزامات.
يحتوي هذا المشروع على وحدة فرعية من Git، تأكد من الاستنساخ باستخدام --recurse-submodules أو قم بتشغيل git submodule update --init بعد الاستنساخ.
ستحتاج إلى هذه الأشياء لبناء المشروع:
pip3 install meson)brew install llvm، على لينكس، 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) ملاحظة: يجب تضمين هذا الاعتماد.افتح المشروع في Xcode، وافتح ملف iSH.xcconfig، وقم بتغيير ROOT_BUNDLE_IDENTIFIER إلى شيء فريد. ستحتاج أيضًا إلى تحديث معرّف فريق التطوير في إعدادات بناء المشروع (وليس الهدف!). ثم انقر على Run. هناك نصوص برمجية يجب أن تقوم بكل شيء آخر تلقائيًا. إذا واجهت أي مشاكل، افتح مشكلة وسأحاول المساعدة.
لإعداد بيئتك، انتقل إلى المشروع عبر cd وقم بتشغيل meson build لإنشاء دليل بناء في build. ثم انتقل إلى دليل البناء وقم بتشغيل ninja.
لإعداد نظام ملفات Alpine Linux مستقل، قم بتنزيل الحزمة المضغوطة minirootfs لـ i386 من موقع Alpine وقم بتشغيل ./tools/fakefsify، مع تمرير الحزمة المضغوطة كوسيطة أولى واسم دليل الإخراج كوسيطة ثانية. ثم يمكنك تشغيل الأشياء داخل نظام ملفات Alpine باستخدام ./ish -f alpine /bin/sh، بافتراض أن دليل الإخراج يسمى alpine. إذا لم يكن tools/fakefsify موجودًا في دليل البناء الخاص بك، فقد يكون ذلك بسبب عدم العثور على libarchive على نظامك (انظر أعلاه لطرق تثبيته).
يمكنك استبدال ish بـ tools/ptraceomatic لتشغيل البرنامج في عملية حقيقية والتنقل خطوة بخطوة ومقارنة المسجلات في كل خطوة. أستخدمه لتصحيح الأخطاء. يتطلب لينكس 64 بت الإصدار 4.11 أو أحدث.
يحتوي iSH على عدة قنوات تسجيل يمكن تمكينها في وقت البناء. بشكل افتراضي، جميعها معطلة. لتمكينها:
ISH_LOG في iSH.xcconfig إلى قائمة مفصولة بمسافات من قنوات التسجيل.meson configure -Dlog="<قائمة مفصولة بمسافات من قنوات التسجيل>".القنوات المتاحة:
strace: القناة الأكثر فائدة، تسجل معلمات وقيمة الإرجاع لكل استدعاء نظام تقريبًا.instr: تسجل كل تعليمة يتم تنفيذها بواسطة المحاكي. هذا يبطئ الأمور كثيرًا.verbose: سجلات تصحيح لا تندرج ضمن فئة أخرى.DEFAULT_CHANNEL لمعرفة ما إذا تمت إضافة قنوات تسجيل إضافية منذ تحديث هذه القائمة.ربما يكون الشيء الأكثر إثارة للاهتمام الذي كتبته كجزء من iSH هو المترجم الفوري. إنه ليس JIT تمامًا لأنه لا يستهدف كود الآلة. بدلاً من ذلك، يقوم بتوليد مصفوفة من المؤشرات إلى دوال تسمى الأدوات (gadgets)، وتنتهي كل أداة باستدعاء ذيل للدالة التالية؛ مثل تقنية الكود المترابط المستخدمة من قبل بعض مترجمي Forth. النتيجة هي تسريع بنحو 3-5 مرات مقارنة بالمحاكاة باستخدام تفريع تبديل أبسط.
لسوء الحظ، اتخذت قرارًا بكتابة جميع الأدوات تقريبًا بلغة التجميع. ربما كان هذا قرارًا جيدًا من حيث الأداء (على الرغم من أنني لن أعرف أبدًا على وجه اليقين)، لكنه كان قرارًا فظيعًا من حيث قابلية القراءة والصيانة وصحتي العقلية. كمية الهراء التي اضطررت لتحملها من المترجم/المجمّع/الرابط هائلة. يبدو وكأن هناك شيطانًا هناك يتأكد من أن الكود الخاص بي مشوه بما فيه الكفاية، وإذا لم يكن كذلك، يختلق أسبابًا غبية لعدم ترجمته. للبقاء عاقلًا أثناء كتابة هذا الكود، اضطررت لتجاهل أفضل الممارسات في هيكلة الكود والتسمية. ستجد وحدات ماكرو ومتغيرات بأسماء وصفية مثل ss و s و a. وحدات ماكرو للمجمّع متداخلة بشكل لا يصدق. وفوق ذلك، لا توجد تعليقات تقريبًا.
لذا تحذير: التعرض طويل الأمد لهذا الكود قد يسبب فقدان العقل، كوابيس حول وحدات ماكرو GAS وأخطاء الرابط، أو أي عدد من الآثار الجانبية المرهقة الأخرى. هذا الكود معروف لولاية كاليفورنيا بأنه يسبب السرطان والعيوب الخلقية والأضرار الإنجابية.