19/07/2022
iOS-emulering på x86 macOS: En dybdegående guide
I en verden, hvor Apple har revolutioneret computerindustrien med deres ARM-baserede M1-chips, der muliggør kørsel af iOS-apps på Mac, er det naturligt at undre sig over mulighederne for ældre, x86-baserede systemer. Selvom den nyeste teknologi fra Apple gør det nemmere at køre iOS-apps, har der i årevis eksisteret et ønske om at kunne emulere iOS på traditionelle x86-processorer. Dette dokument vil dykke ned i de tekniske udfordringer og de innovative løsninger, der er udviklet for at opnå netop dette.

Udfordringerne ved ARM-til-x86-emulering
At køre iOS-apps, der er kompileret til ARM-arkitekturen, på en x86-baseret macOS-platform er en kompleks opgave. Den mest åbenlyse hindring er instruktionsoversættelsen mellem de to forskellige CPU-arkitekturer. Instruktioner, der er skrevet til ARM, skal oversættes til noget, som en x86-processor kan forstå og eksekvere. Dette kræver sofistikerede emuleringsteknikker, ofte ved hjælp af værktøjer som QEMU, der kan udføre Just-In-Time (JIT) kompilering.
Udover selve instruktionsoversættelsen opstår der problemer med Application Binary Interface (ABI). Forskellige arkitekturer har forskellige måder at organisere og kalde funktioner på, herunder hvordan data sendes mellem funktioner og hvordan hukommelsen håndteres. At skabe en bro mellem disse ABI-standarder er essentielt for at sikre, at iOS-apps kan interagere korrekt med macOS-systemet og dets frameworks.
Innovative Løsninger og Teknologier
For at overvinde disse udfordringer har udviklere taget utraditionelle metoder i brug. En af de mest markante tilgange involverer modifikation af selve Xcode Simulator. Standard iOS Simulator kan køre iOS-apps kompileret til x86, men disse er typisk kun tilgængelige, hvis man har adgang til kildekoden. For at kunne køre kommercielle, ARM-baserede iOS-apps, har man været nødt til at modificere simulatoren dybtgående.
En central del af løsningen har været brugen af QEMU til instruktionsoversættelse. I denne opsætning kører kun de specifikke instruktioner inden for selve iOS-appen i QEMU's JIT-tilstand, mens resten af Apple's frameworks kører native på Intel CPU'en. Dette kræver en kompleks integration, hvor QEMU fungerer som en oversætter for de ARM-specifikke dele af applikationen.
ABI-broen og libc++.dylib
At skabe en fungerende ABI-bro er en af de mest krævende aspekter. Dette indebærer ikke kun C-standarder, men også C++. Forskelle i hukommelseslayout, virtuelle funktionstabeller og implementeringer af C++-klasser mellem ARM og x86 kan være subtile, men kritiske. For at omgå disse problemer har nogle projekter valgt at levere en ARM-baseret libc++.dylib til de emulerede iOS-apps.
Dette introducerer dog et nyt problem: Apple's egne frameworks, der kører på x86-64, bruger også C++. Det betyder, at systemet skal kunne håndtere to kopier af libc++.dylib i hukommelsen – én x86-64-baseret og én ARM-baseret. Apple's dynamiske linker, dyld, understøtter ikke dette direkte. Løsningen har været at foretage binære patches på dyld_sim (den version af dyld, som simulatoren bruger) eller at kompilere modificerede versioner af Apples open source-kode, hvilket ofte er en betydeligt mere kompliceret proces.

Håndtering af C++-undtagelser
C++-undtagelseshåndtering udgør endnu en betydelig udfordring. Når en undtagelse kastes, kan stakken indeholde funktionelle rammer fra både x86-64 og ARM. Den oprindelige logik for at finde den korrekte undtagelseshåndtering fungerer ikke optimalt i denne hybride situation. For at løse dette har det været nødvendigt at genkompilere biblioteker som libunwind med specifikke patches.
Yderligere Komplikationer og Reverse Engineering
Udover de nævnte udfordringer er der en række andre tekniske hurdler, der skal overvindes for at opnå en stabil iOS-emulering på x86-64 macOS. Disse inkluderer:
- Acceleration og kompatibilitet af Objective-C systemet.
- Håndtering af Metal API, Apples grafiske API.
- Modifikation af XNU-kernen via kernel extensions.
- Omfattende reverse engineering for at sikre, at iOS-apps kører fejlfrit.
Kompleksiteten af disse systemer kan hurtigt overstige de oprindelige forventninger. Projekter, der har haft succes med at køre apps som WeChat og Arena of Valor, vidner om den enorme mængde arbejde, der ligger bag.
Fremtiden for iOS-emulering og Corellium
Med Apples skift til ARM-baserede M1-chips og tilhørende macOS-versioner, er behovet for at emulere iOS på x86-platforme måske faldende. Dog er der fortsat interesse i feltet, og nye løsninger dukker op.
En bemærkelsesværdig tjeneste er Corellium, der tilbyder virtualiserede cloud-instanser af iOS. Selvom det ikke er bredt tilgængeligt endnu, repræsenterer det en ny retning for adgang til iOS-miljøer uden for fysiske enheder. Der har også været rapporter om forskeres succes med at boote iOS i QEMU, hvilket indikerer, at der fortsat forskes i emuleringsteknikker.
Der har også været initiativer, der sigter mod at udvikle kommercielle emulatorer til macOS. Disse projekter kræver en betydelig investering i udvikling og reverse engineering, men de lover at kunne køre et bredere udvalg af iOS-apps direkte på Mac.
Kan man emulere en iOS-enhed på en Mac?
Ja, men med visse forbehold. Den mest almindelige og understøttede metode er at bruge Xcode Simulator, der følger med udviklingsmiljøet Xcode. Denne simulator giver mulighed for at teste apps på forskellige iOS-enheder og -versioner direkte på din Mac. Den kører dog apps kompileret til den arkitektur, din Mac bruger (typisk x86 eller ARM for nyere Macs).

For at køre *kommercielle* iOS-apps (typisk kompileret til ARM) på en x86-baseret Mac, kræves der mere avancerede og ofte eksperimentelle metoder, som beskrevet ovenfor. Disse involverer dybe systemmodifikationer og kan være ustabile eller kræve teknisk ekspertise.
Opsummering og Konklusion
At emulere iOS på x86-baserede macOS-systemer er en teknisk udfordrende, men ikke umulig opgave. Den kræver løsninger på problemer som instruktionsoversættelse, ABI-kompatibilitet og håndtering af forskellige biblioteker og frameworks. Selvom Apples nyere ARM-baserede Macs gør det lettere at køre iOS-apps, fortsætter arbejdet med at muliggøre dette på ældre x86-systemer. For udviklere og entusiaster, der ønsker at udforske disse muligheder, er der åbne projekter og forskningsinitiativer, der tilbyder indsigt og potentielle løsninger.
Ofte Stillede Spørgsmål
Findes der en iOS-emulator til x86-baseret macOS?
Ja, der findes projekter, der har opnået succes med at emulere iOS på x86 macOS, men de er ofte komplekse og kræver teknisk indsigt. Den mest tilgængelige metode er at bruge Xcode Simulator, som dog primært kører apps kompileret til din Macs arkitektur.
Kan jeg køre enhver iOS-app på min Mac?
Med Xcode Simulator kan du køre apps, du selv udvikler, og som er kompileret til macOS's arkitektur. At køre generelle kommercielle iOS-apps kræver specifikke emulatorer, der kan håndtere ARM-til-x86-oversættelse, hvilket ikke altid er muligt eller stabilt.
Hvad er den største udfordring ved iOS-emulering på x86?
De største udfordringer inkluderer instruktionsoversættelse mellem ARM og x86, håndtering af forskellige ABI-standarder, og integration af Apples frameworks, der er kompileret til forskellige arkitekturer.
Er der alternativer til at køre iOS-apps på Mac?
Udover Xcode Simulator er der cloud-baserede tjenester som Corellium, der tilbyder virtualiserede iOS-miljøer. Fremtidige udviklinger kan også omfatte mere brugervenlige kommercielle emulatorer.
Hvis du vil læse andre artikler, der ligner iOS-emulator til x86 macOS, kan du besøge kategorien Software.
