On
Fundamentaalisia juttuja on esim.
1) Kysymys, koska ylipäätään koodi käännetään, ja miten funktiopointterit hanskataan?
Ohjelmakoodia ei ole vain binääreissä vaan myös
* Dynaamisesti ladatuissa kirjastoissa
* Sitä generoidaan dynaamisesti ajonaikana. Erityisesti tämän tunnistaminen ja hanskaaminen oikein on vaikeaa.
Eli koska tahansa saatetaan kutsua funktiota jota ei ollut siinä binäärissä mikä ladattiin(ja käännettiin ohjelmaa ladatessa muistiin). Eli kaikista funktiopointereista pitää tarkastaa, onko sen kohde jo käännetty vai ei, ja mahdollisesti funktiokutsun tullen joko 1) triggeroida hyvin pitkään kestävä kääntöprosessi tai 2) suorittaa se funktio hitaalla tulkkausloopilla.
Ja kumpaan niiden funktiopointterien ylipäätään pitäisi osoittaa, alkuperäiseen x86-funktioon vai sen ARMille käännettyyn kopioon?
Ja pitää mm. tunnistaa, että jos ylikirjoitetaankin koodia, joka on jo käännetty, ja tässä tilanteessa invalidoida se käännetty koodi. Miten tämä tunnistetaan?
2) Vaikka asia, mitä x86-käsky korkealla tasolla tekee kääntyisi yhdeksi ARM-käskyksi, sen x86n-käskyn tarkka semantiikka ei usein käännykään yhdeksi ARM-käskyksi.
Tällainen juttu on esim. x86n flags-rekisteri. Melkein kaikki käskyt päivittävät sitä. Ja kun sen tilan pitää olla konsistentti myös esim. virtuaalimuistin läsnäolopoikkeuksien yms. yli, sitä ei usein voi vaan ignorata, vaan sen käytös pitää oikeasti emuloida kunnolla.
3) ARMilla on löysempi muistimalli kuin x86lla. Monisäikeistetty koodi voi luottaa x86n tiukempaan muistijärjestykseen, mutta jos se vaan binäärikäännetän suoraan käyttämän ARMin lataus- ja tallennuskäskyjä, se voi bugata. Jotta monisäikeistetty x86-koodi toimii ARMille binäärikännettynä kaikissa tilanteissa varmasti oikein, joudutaan siihen lisäämään ylimääräisiä synkronointikäskyjä, joita alkuperäisessä x86-koodissa ei ollenkaan tarvita.
4) Apple hallunnee käyttää 16 kiB virtuaalimuistisivua (mm. koska se mahdollistaa isomman L1D-kakun tekemisen nopeaksi, tehty jo Applen nykysissä ytimissä). x86-softat olettavat 4 kiB virtuaalimuistisivun. Jos softa kikkailee jotain jollain mmap()llä, erikokoinen virtuaalimuistisivu saattaa rikkoa ne.
Voi olla että Apple joutuu tarjoamaan x86-softille 4 kiB virtuaalimuistisivut ja laittamaan L1D-kakun toimimaan eri moodissa (joka on joko hitaampi tai disabloi 75% sen kapasiteetista) kun käytetään 4 kiB virtuaalimuistisivuja. Tosin en ole aivan varma, voiko ARMv8lla kerralla edes olla yhtä aikaa käytössä sekä 4 kiB että 16 kiB sivukokoja, jos ei, sitten tämä on vielä yhteensopivuusongelma eikä vain nopeusongelma x86-emulaatiolle.
80% ohjelmista saadaan toimimaan 99% tilanteista melko nopeasti binäärikääntäjällä, joka bugaa lopuilla 20% ohjelmilla todella pahasti ja näillä 80%llakin 1% tapauksista.
Ongelma vaan on se, että tällainen toimivuus ei ole hyväksyttävää. Ne harvinaisten erikoistapausten hitaat tunnistukset on
pakko olla siellä että saadaan ne harvinaiset erikoistapaukset toimimaan oikein, ja niiden tunnistusten olemassaolo hidastaa
kaikkia ohjelmia merkittävästi.
Tästä on aika paljon juttua realworldtechin forumilla, kannattaa lukea Linusin kommentteja sieltä:
www.realworldtech.com