M4 MacでLinux起動に成功:スリープで全レジスタが揮発するハードウェアの壁を突破

M4 MacでLinux起動に成功:スリープで全レジスタが揮発するハードウェアの壁を突破

LinuxApple SiliconオープンソースM4

データソース:yuka.dev + Asahi Linux 社区

2024年11月、開発者のYureka LilianはM4チップを搭載したMac miniを購入した。過去のApple Silicon各世代が解析されてきたスピードを考えれば、この最新マシンでオープンソースOSを走らせるのも時間の問題に思われた。しかし、CPUのすべてのコアを有効化した状態でコマンドラインへの起動に成功するまでに、実に17ヶ月の歳月を要することになった。

仮想マシンによる監視プローブを遮断したApple

ここ数年、オープンソースコミュニティはApple Siliconのリバースエンジニアリングにおいて洗練された手法を確立していた。カスタマイズした仮想マシン上でmacOSを実行し、カーネルドライバとハードウェアの間で交わされるMMIO(メモリマップドI/O)のアクセスログを追跡するアプローチだ。システムがどのようにハードウェアへ指示を出しているかを観察し、その挙動をそのままLinux側に再現すればよかった。

だがM4で、Appleはその明かりを完全に消し去った。この世代のチップではカーネル保護のためにSPTM(Secure Page Table Monitor)が強制適用され、従来のMMIOトレース手法が一切通用しなくなったのだ。仮想マシン下でシステムを稼働させるには基盤アーキテクチャの根底からの再構築が必要となり、オープンソースコミュニティは一切の仕様書がない完全なブラックボックスと素手で向き合うことを余儀なくされた。

Sven Peterの発言スクリーンショット 図:2025年4月にSven PeterがMastodonに投稿したメッセージ。出典:yuka.dev

たった1文字の出力から始める地道なデバッグ

高度な解析ツールが使えなくなったことで、開発者はもっとも泥臭い試行錯誤へと立ち戻るしかなかった。M4向けのブートローダ「m1n1」は、最小限のBRINGUPモードでしか立ち上がらない。特定のハードウェアを初期化しようとしたり、適切なリセットベースアドレスに書き込みを行ったりしただけで、マシンは即座にクラッシュした。

そこでYureka Lilianは、きわめて原始的なアセンブリルーチンを持ち出した。1文字の a だけをシリアル出力するコードを用意し、カーネル起動の最序盤に挿入したのだ。コードの挿入位置を移動させながら二分探索で範囲を絞り込み、ついにクラッシュを引き起こす具体的な命令を特定することに成功した。この過程で判明したハードウェアレジスタのロック問題は、その後のファームウェア更新によってApple側で密かに解消された。

M4で初めてシェル起動に成功した端末スクリーンショット 図:M4 Mac mini上でLinuxが初めてシェルまで起動した様子。hyfetchにホスト名「Apple Mac Mini (M4, 2024)」が表示されている。出典:yuka.dev

スリープのたびに全レジスタを強制クリアするハードウェア

初期の起動クラッシュはほんの序の口にすぎなかった。真に開発者の足を止めたのは、アーキテクチャの常識を覆すM4チップのハードウェア仕様だった。

初期のMシリーズチップには隠しスイッチが用意されていた。割り込み待ちのスリープ命令が発行されると、CPUは32基の汎用レジスタのデータをすべてゼロクリアする設計になっていたのだ。当時のLinux開発者はより深いスリープによる省電力性を得るため、スリープの直前直後に手動でレジスタ内容を退避・復元することで、このスイッチを意図的に有効化していた。

マルチコア起動後のシステム情報スクリーンショット 図:M4上で全コアを有効化してシェル起動に成功した後のシステム情報。出典:yuka.dev

ところがAppleはM4において、このデータ消去動作を「デフォルトかつ無効化不能」なハードウェア仕様へと変更してしまった。これはスリープ命令によってアーキテクチャの状態が失われてはならないと定めるARM64の公式仕様に真っ向から違反している。開発陣が暗中模索の末に突き止めた真実は、このCPUが少し仮眠を取るだけで、レジスタの記憶が強制的に消し去られるという異常な振る舞いだった。

NOP命令への置換でハードウェアの壁を回避

この強引なハードウェア設計に対し、コミュニティが打ち出した解決策はきわめて明快だった。2026年4月、開発者はカーネル内のすべてのスリープ命令を空命令(NOP)へと置き換えた。これにより、M4の全CPUコアがようやく稼働状態に到達した。

彼らは他の動作環境を巻き添えにしかねない場当たり的なパッチを当てるのではなく、Linuxカーネルのメインラインに対し、スリープ命令を能動的に迂回できる早期ブートパラメータの追加パッチを提案した。Appleは未公開のハードウェア挙動で参入の門を閉ざしたが、オープンソースコミュニティは幾重もの試行錯誤によってその暗号を解き明かし、上流カーネル側に非標準ハードウェアのためのパッチを受け入れさせるまでに至った。閉ざされた孤島の半導体を前に、それは開発者たちの粘り強い忍耐が生んだ勝利である。

参考リンク:

  • yuka.dev ブログ記事
  • Asahi Linux コミュニティ動向