Hlavní navigace

Jak v Correlium portovali Linux na Apple M1

29. 1. 2021
Doba čtení: 6 minut

Sdílet

Před několika dny ohlásili vývojáři z Correlium zprovoznění Ubuntu na počítači Apple s 5nm ARM SoC M1. Jde o počátek snah, které snad jednoho dne povedou k plnohodnotnému běhu Linuxu na Apple ARMech.

Nic naplat, Apple může člověk nesnášet jak chce, ale faktem zůstává, že SoC Apple M1, vyráběné špičkovým 5nm EUV procesem u TSMC, je patrně nejzajímavější procesorový počin roku 2020 (čest všem Ryzenům / Threadripperům, ale je tomu zkrátka tak). Navíc stroje od Apple – v případě tohoto čipu tedy minipočítač mac mini a notebook macbook – mají pověst něčeho, co i linuxoví vývojáři rádi používají a tak bylo dávno před uvedením Apple M1 na trh jasné, že jakmile Apple začne na ARMy přecházet, začnou i snahy linuxové komunity dostat na tyto ARMy Linux.

Výjimečnost Apple M1

Připomeňme, že Apple M1 v souvislostech jsme se již věnovali dříve, stejně jako kolegové na Cnews. Toto dříví již nosit do lesa dnes nebudeme.

Již první testy ukázaly, že Apple M1 je ve svých typických úlohách, resp. standardních benchmarcích výtečným procesorem, což navíc podtrhávalo srovnání s nedávnými modely Macbooků s Intel x86, které potřebují ventilátor a přesto se v podstatě přehřívají. O to více vynikaly výsledky Apple M1 a zejména vynikající poměr výkon/spotřeba (za který vděčí Apple zejména vědcům v TSMC a jejich 5nm výrobnímu procesu).

Linuxové lámání Apple M1 v Correlium

Correlium sama uvádí, že vývoj produktů Apple, jejich mobilní ekosystém, sledují od dob iPhone 6, tedy od roku 2014, kdy iPhony dostaly nový 64bit dvoujádrový ARM. Jednou z věcí pro Apple typických bylo soustředění se na co nejvyšší jednovláknový výkon, nikoli na vměstnání co největšího počtu jader do SoC – což lze jistě potvrdit, když v době, kdy se Apple pohyboval kolem 2–4 jader byly běžně na trhu spousty telefonů s Androidem vybavených SoC konceptu big.LITTLE s celkově 8 CPU jádry. Na tuto hodnotu to Apple dotáhl nyní s M1.

V „předmluvě“ k textu o portování dále zmiňují své práce na vlastním virtualizačním systému pro Apple ARMy, u kterého se naučili o specifikách této platformy hodně, přičemž vše vyústilo loňského roku ve vytvoření portu kernelu pro procesor Apple A10 (pozn.: jde o 16nm FinFET SoC z konce roku 2016, které pohání iPhone 7 / 7 Plus a některé iPady z let 2018 až 2019). A jelikož Apple nezakázal používání uživatelských kernelů na strojích s M1, Correlium se s chutí pustili do vývoje linuxového portu pro tento čip.

Vlastní práce na portu

Dobrý vklad do začátku prací na portu Linuxu pro M1 přinesla skutečnost, že Apple M1 sdílí určité prvky s mobilními SoC pro iPhony/iPady. První problémy se tak objevily „až“ (už) při psaní ovladačů pro M1, kdy se ukázaly jiné, již velké odlišnosti od mobilních SoC. Svět 64bit ARM čipů se sice ustálil na jedné velké rodině prvků, vlastností a rozhraní firmwaru, ale Apple téměř nic z toho ve svém SoC M1 nepoužívá.

Už jen boot jádra operačního systému probíhá jinou cestou. Bootloader – zde nazývaný iBoot – načítá spustitelné soubory objektů ve formátu zvaném Mach-0, volitelně komprimovaném a obaleném v podepsaném formátu ASN.1, zvaném zde IMG4. Naproti tomu Linux na 64bit ARMu normálně startuje jako flat binárka (volitelně s kompresí) či ve Windows formátu PE (Portable Executable) tam, kde je použito UEFI.

Velké překvapení dále přichází na scénu, když se spouštějí další CPU jádra. Na 64bit ARMu se tohle typicky dělá zavoláním firmwaru skrze rozhraní značené PSCI. U Apple M1 se CPU jádra spouštějí na adrese specifikované v MMIO registru (nastaveném na specifický offset uvnitř obrazu kernelu, následně uzamčeném bootloaderem). Apple se navíc rozhodl navrhnout si vlastní řadič přerušení, Apple Interrupt Controller (AIC), který není kompatibilní s žádným ARM GIC standardem. Navíc časovač není jako u ARMu napojen přímo na CPU jádro, ale místo toho je směrován do specifické, špatně pochopitelné části zvané FIQ, která evokuje dávné doby 32bit ARM éry. Linux sám o sobě tuto cestu nepodporoval, takže bylo potřeba ji do něj doplnit.

Podpora FIQ přitom byla velmi důležitá i z dalšího důvodu. Apple totiž FIQ začal u novějších ARM SoC – včetně M1 – používat pro mezijádrovou komunikaci (meziprocesorová přerušení jsou komunikována přes FIQ, nikoli „standardně“ přes MMIO / AIC, jako i u starších Apple SoC). Na toto ale naštěstí byli v Correlium připraveni.

Pak už jen stačilo doladit pár posledních drobností a přidat pre-loader, který pro Linux dělá překladovou vrstvu a „poskytuje trampolínu“ k nastartování CPU jader. Poté již bylo možné čip zprovoznit, nastavit framebuffer a při startu systému být uvítán osmi tučňáky v příkazové řádce.

USB periferie

Samotné zprovoznění Linuxu pochopitelně nestačí, pokud není možná interakce uživatele. Vývojáři Correlium tedy dále řešili, jak k Macu s Apple M1 připojit periferie, ideálně zprovoznit standardní USB. Nabízely se tři teoretické cesty: USB host, který je součástí M1 a obsluhuje porty Thunderbolt/USB, dále xHCI USB host na PCIe sběrnici, který obsluhuje porty typu A a do třetice pak Bluetooth rozhraní.

Bluetooth byl vyloučen velmi rychle. Apple zde používá sice na PCIe založený protokol, ale svůj nestandardní. Vyžadoval by nejen zprovoznit PCIe rozhraní M1, ale také napsat kernelový ovladač pro něj. Možnosti se tedy zredukovaly na dvě USB cesty.

Apple už delší dobu ve svých čipech používá dual-role USB řadič Synopsys DWC3, pro nějž existuje kernelový ovladač. Jenže to by nebyl Apple, aby na něm něco neupravil, zde konkrétně přidal nějakou vlastní logiku navíc, čímž vývojářům Correlium hodil do cesty další klacky navíc.

Jak PCIe USB řadič, tak zabudovaný USB řadič DWC3 v M1 používají IOMMU jednotky zvané DART. Apple design svých DART ladí už řadu let, Correlium je hodnotí jako excelentní a s podporou všech vlastností IOMMU. Aby bylo možné použít porty USB typu C, bylo potřeba vyřešit komunikaci s procesorem po I2C (tedy GPIO a I2C ovladače), kde Apple opět využívá vlastní specifický firmware. Correlium tohle už vyřešilo, když vyvíjeli virtualizované modely. Po pár dnech dalších prací tak bylo schopni přijít na kloub všem detailům kolem USB a konečně zprovoznit připojení USB hubu, přes který funguje jak USB klávesnice a myš, tak třeba USB flashka. A bylo možné konečně spustit standardní linuxovou distribuci.

Root obecny

Postup, jak něco takového může učinit jakýkoli uživatel, je popsán v článku na webu Correlium. K tomu ještě doplňme, že souběžně s CPU jako takovým probíhá lámání specifik též u GPU části, kde už se daří první zkušební rendery.

Dlužno podotknout, že v popsané metodě je používán běh Ubuntu ve verzi pro Raspberry Pi z USB flashky připojené přes hub k počítači Apple s M1. Požitek z běhu systému tak bude mimo jiné odvislý od rychlosti USB hubu či flashky a můžeme s jistotou konstatovat, že ve srovnání s NVMe/PCIe SSD bude nejspíš viditelně pomalejší. Zdali dojde v budoucnu i na řešení tohoto aspektu, se nechme překvapit.

Autor článku

Příznivec open-source rád píšící i o ne-IT tématech. Odpůrce softwarových patentů a omezování občanských svobod ve prospěch korporací.