โครงการเพื่อให้เชลล์ Linux ทำงานบน iOS โดยใช้ USERMODE X86 EMULATION และ SYSCALL Translation
สำหรับสถานะปัจจุบันของโครงการตรวจสอบแท็บปัญหาและบันทึกการกระทำ
โครงการนี้มี submodule 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 ) สิ่งที่ต้องทำ: มัดพิงนี้ เปิดโครงการใน Xcode เปิด ish.xcconfig และเปลี่ยน ROOT_BUNDLE_IDENTIFIER เป็นสิ่งที่ไม่เหมือนใคร คุณจะต้องอัปเดตรหัสทีมพัฒนาในโครงการ (ไม่ใช่เป้าหมาย!) สร้างการตั้งค่า จากนั้นคลิกเรียกใช้ มีสคริปต์ที่ควรทำทุกอย่างโดยอัตโนมัติ หากคุณพบปัญหาใด ๆ ให้เปิดปัญหาและฉันจะพยายามช่วย
ในการตั้งค่าสภาพแวดล้อมของคุณ CD ไปยังโครงการและเรียกใช้ meson build เพื่อสร้างไดเรกทอรีบิลด์ใน build จากนั้นซีดีไปยังไดเรกทอรีบิลด์และเรียกใช้ ninja
หากต้องการตั้งค่าระบบไฟล์ Alpine Linux ที่มีอยู่ในตัวเองให้ดาวน์โหลด Alpine MiniRootfs Tarball สำหรับ I386 จากเว็บไซต์อัลไพน์และเรียกใช้ ./tools/fakefsify fakefsify โดย Minirootfs Tarball เป็นข้อโต้แย้งแรกและชื่อของไดเรกทอรีเอาท์พุทเป็นข้อโต้แย้งที่สอง จากนั้นคุณสามารถเรียกใช้สิ่งต่าง ๆ ภายในระบบไฟล์อัลไพน์ด้วย ./ish -f alpine /bin/sh โดยสมมติว่าไดเรกทอรีเอาต์พุตเรียกว่า alpine หาก tools/fakefsify ไม่มีอยู่สำหรับคุณในไดเรกทอรีบิลด์ของคุณนั่นอาจเป็นเพราะมันไม่พบ libarchive ในระบบของคุณ (ดูด้านบนสำหรับวิธีการติดตั้ง
คุณสามารถแทนที่ ish ด้วย tools/ptraceomatic เพื่อเรียกใช้โปรแกรมในกระบวนการจริงและขั้นตอนเดียวและเปรียบเทียบการลงทะเบียนในแต่ละขั้นตอน ฉันใช้มันสำหรับการดีบัก ต้องการ Linux 64 บิต 4.11 หรือใหม่กว่า
ISH มีช่องการบันทึกหลายช่องซึ่งสามารถเปิดใช้งานได้ในเวลาสร้าง โดยค่าเริ่มต้นทั้งหมดของพวกเขาจะถูกปิดใช้งาน เพื่อเปิดใช้งาน:
ISH_LOG ใน ish.xcconfig เป็นรายการช่องบันทึกที่คั่นด้วยอวกาศmeson configure -Dlog="<space-separated list of log channels>"ช่องที่มีอยู่:
strace : ช่องที่มีประโยชน์ที่สุดบันทึกพารามิเตอร์และค่าส่งคืนของการโทรเกือบทุกระบบinstr : บันทึกคำสั่งทุกคำสั่งที่ดำเนินการโดย Emulator สิ่งนี้ทำให้สิ่งต่าง ๆ ช้าลงมากverbose : บันทึกการดีบักที่ไม่เหมาะสมกับหมวดหมู่อื่นDEFAULT_CHANNEL เพื่อดูว่ามีการเพิ่มช่องบันทึกเพิ่มเติมหรือไม่เนื่องจากรายการนี้ได้รับการอัปเดตอาจเป็นสิ่งที่น่าสนใจที่สุดที่ฉันเขียนเป็นส่วนหนึ่งของ ISH คือล่าม มันไม่ใช่ JIT เพราะมันไม่ได้กำหนดเป้าหมายรหัสเครื่อง แต่จะสร้างอาร์เรย์ของพอยน์เตอร์เป็นฟังก์ชั่นที่เรียกว่าอุปกรณ์และอุปกรณ์แต่ละอันจะจบลงด้วยการเรียกเก็บเงินไปยังฟังก์ชั่นถัดไป เช่นเดียวกับเทคนิครหัสเกลียวที่ใช้โดยล่ามบางคน ผลที่ได้คือการเร่งความเร็วประมาณ 3-5x เมื่อเทียบกับการจำลองโดยใช้การส่งสวิตช์ที่ง่ายขึ้น
น่าเสียดายที่ฉันตัดสินใจเขียนอุปกรณ์เกือบทั้งหมดในภาษาแอสเซมบลี นี่อาจเป็นการตัดสินใจที่ดีเกี่ยวกับการแสดง (แม้ว่าฉันจะไม่เคยรู้แน่นอน) แต่เป็นการตัดสินใจที่น่ากลัวเกี่ยวกับความสามารถในการอ่านการบำรุงรักษาและความมีสติของฉัน ปริมาณของพล่ามที่ฉันต้องทนจากคอมไพเลอร์/แอสเซมเบลอร์/linker นั้นบ้า มันเหมือนกับว่ามีปีศาจอยู่ในนั้นที่ทำให้แน่ใจว่ารหัสของฉันมีรูปร่างผิดปกติเพียงพอและถ้าไม่ได้ทำเหตุผลโง่ ๆ ว่าทำไมมันไม่ควรคอมไพล์ เพื่อให้มีสติในขณะที่เขียนรหัสนี้ฉันต้องเพิกเฉยต่อแนวทางปฏิบัติที่ดีที่สุดในโครงสร้างรหัสและการตั้งชื่อ คุณจะพบแมโครและตัวแปรที่มีชื่อเชิงพรรณนาเช่น ss และ s และ a แอสเซมเบลอร์แมโครซ้อนกันเกินกว่าความเชื่อ และยิ่งไปกว่านั้นก็แทบจะไม่มีความคิดเห็น
ดังนั้นคำเตือน: การเปิดรับรหัสนี้ในระยะยาวอาจทำให้สูญเสียสติ, ฝันร้ายเกี่ยวกับมาโครแก๊สและข้อผิดพลาดของตัวเชื่อมโยงหรือผลข้างเคียงอื่น ๆ ที่ทำให้ร่างกายอ่อนแอ รหัสนี้เป็นที่ทราบกันดีว่ารัฐแคลิฟอร์เนียทำให้เกิดมะเร็งข้อบกพร่องที่เกิดและอันตรายจากการสืบพันธุ์