Linux su Apple M1, sfida ardua: primo progress report di Asahi Linux

by Matteo Gatti on

A gennaio, qui su LFFL, vi ho parlato del progetto Asahi Linux, portato avanti dallo sviluppatore giapponese Hector Martin, noto anche come “marcan”. Martin ambisce a creare un port Linux per Apple Silicon. Oggi possiamo dare un primo sguardo ai passi avanti fatti negli ultimi due mesi grazie al primo progress report ufficiale.

Il rapporto, sfortunatamente, non si conclude con un collegamento a una distribuzione Linux completamente funzionante. Tuttavia, illustra quanto i Mac basati su Apple Silicon divergano dagli standard cui siamo abituati.

Asahi Linux: non è banale

La nuova architettura di Apple sta creando più difficoltà del previsto. Hector Martin descrive la complessità di questo nuovo chip Apple che rende difficile far funzionare un altro sistema operativo su Mac.

Apple non consente ancora di installare un kernel non-Apple sull’architettura Apple Silicon. Manca il supporto per il comando kmutil configure-boot.

I Mac Apple Silicon si avviano in modo completamente diverso rispetto ai PC normali e non usano alcuno standard esistente. Il boot è più simile alle piattaforme embedded (come i telefoni Android o i dispositivi iOS). Tuttavia, Apple ha adottato alcuni passaggi per rendere l’avvio più simile a quello di un Mac Intel. Ad esempio, sapevate che i Mac Apple Silicon non consentono il boot da un dispositivo di archiviazione esterno? O che il bootloader non può mostrare un’interfaccia utente grafica?

Di fronte a una cosa completamente nuova Marcan, insieme a chi lo aiuta in questa impresa, si è messo a scavare (per capire) e a documentare (per tenere traccia di quanto capito).

m1n1

Per gestire questa complessità, e tutte le differenze tra Silicon e le altre architetture note, Marcan ha deciso di sviluppare un nuovo bootloader. L’ha battezzato m1n1 e potrà essere usato anche su un Mac usando il tool kmutil. Una volta pronto, la catena per il boot sarà la seguente: m1n1 → U-Boot → GRUB → Linux. U-Boot mette a disposizione i servizi UEFI necessari a GRUB ma non supportati da m1n1. Vi sembra assurdo? Su sistemi embedded queste lunghe catene di boot sono abbastanza comuni.

Per far sì che Linux si avvii su un sistema, ci sono cinque componenti che devono assolutamente funzionare correttamente:

  • CPU
  • Memory management unit (MMU)
  • Interrupt controller
  • System timer
  • Una console

Sulla maggior parte dei sistemi AArch64, i primi quattro sono abbastanza standard: Linux non necessita di modifiche ad hoc. Purtroppo, ad Apple, piace fare le cose a modo suo… Riuscire a portare a termine il boot è stata un’impresa proprio per questi “Applismi”.

Per darvi un’idea, vi riporto un esempio che probabilmente vi aiuta a capire quante problematiche Marcan e soci devono risolvere per arrivare al risultato. Di default, M1 opera in una modalità chiamata WFI (Wait for Interrupt) per ridurre il consumo energetico. Da questa modalità può uscire in due modi: power-gate o clock-gate. Sfortunatamente, quando opta per il power-gate, perde il contenuto di tutti i registri della CPU (tranne il program counter e lo stack pointer). Linux non si aspetta che ciò accada: nessuna CPU AArch64 si comporta così. Per risolvere l’empasse gli sviluppatori hanno studiato l’architettura scoprendo che esiste un particolare registro che settato in un certo modo evita questo specifico comportamento. Hanno quindi impostato m1n1 nel modo corretto e sono saltati al problema successivo.

AIC Interrupt Controller

Il compito di una CPU moderna non è solo eseguire le istruzioni in ordine, ma anche reagire ai cambiamenti nell’ambiente che potrebbero richiedere che interrompa ciò che sta facendo e vada a fare qualcos’altro. Queste situazioni vengono chiamate “eccezioni”. Un’eccezione segnala al processore che qualcuno necessita della sua attenzione. La più importante di queste è la richiesta di interrupt (IRQ), che viene utilizzata dalle periferiche hardware per richiedere un’azione della CPU. La CPU, quindi, ha il compito di capire quale periferica necessita di attenzione e di gestire la richiesta.

Sulle CPU AArch64, c’è un singolo ingresso IRQ ed è gestito dal controller di interrupt, o “irqchip” nella terminologia Linux. Sui sistemi con più di un core, il controller IRQ ha anche un altro compito: gestire gli interrupt tra processori (IPI).

La maggior parte dei sistemi AArch64 utilizza un controller di interrupt standard, chiamato Generic Interrupt Controller (GIC). Questo è un controller di interrupt piuttosto complesso e abbastanza completo, con funzionalità avanzate come priorità di interrupt, virtualizzazione e altro.

Come probabilmente avrete intuito, Apple, anche in questo caso, ha deciso di seguire la propria strada sviluppando l’Apple Interrupt Controller (AIC). Marcan e soci hanno dovuto fare il reversal engineering di AIC e sviluppare un driver per consentire a Linux di supportarlo.

Fortunatamente per noi, l’AIC è in realtà abbastanza semplice. Utilizzando i pochi frammenti di documentazione obsoleta che esistono nella parte open source di macOS / iOS (XNU) e sondando l’hardware tramite tentativi ed errori, siamo stati in grado di capire tutto ciò di cui avevamo bisogno per far funzionare gli interrupt e scrivere un driver Linux .

Inutile dire che scrivere un driver di questo tipo è complesso e anche un piccolo errore può richiedere giorni per un’analisi e una corretta soluzione.

In conclusione…

Dopo aver risolto una miriade di problemi sono riusciti a portare a termine ecco m1n1 che riesce a fare il suo lavoro:

Asahi Linux works!

Il progetto è lungi dall’essere ultimato, in questo articolo ho cercato di riassumervi un lunghissimo post, riportando gli aspetti che ritenevo più interessanti. Per tutti i dettagli vi rimando al progress report e vi ricordo i canali ufficiali di Asahi Linux:

Linux su Apple M1, sfida ardua: primo progress report di Asahi LinuxSeguiteci sul nostro canale Telegram, sulla nostra pagina Facebook e su Google News. Nel campo qui sotto è possibile commentare e creare spunti di discussione inerenti le tematiche trattate sul blog.

L'articolo Linux su Apple M1, sfida ardua: primo progress report di Asahi Linux sembra essere il primo su Linux Freedom.

Leggi il contenuto originale su Linux Freedom

Written by: Matteo Gatti