概要
- M4 Mac mini でLinuxを初めて起動した詳細な記録
- Asahi Linuxチーム への感謝と支援の呼びかけ
- SPTM導入 などM4世代特有の課題と対応策
- Linux起動トラブル の原因究明と解決方法
- 今後の展望 と寄付の案内
M4 Mac miniでのLinux初起動記録
- 2024年11月、 M4 Mac mini を購入し、Asahi Linuxによる対応を期待
- M1〜M3世代との共通点を想定しつつも、 SPTM(Secure Page Table Monitor) の導入で難易度上昇
- SPTMはmacOS XNUカーネルの脆弱性対策機構
- これまでのLinux移植は m1n1ハイパーバイザ でMMIOトレースを取得し解析
- SPTM対応にはm1n1の大幅な改修が必要
- 並行して、 セキュアブートの無効化、m1n1のカスタムブート導入、 シリアルコンソール 取得でLinux起動を試行
ロックされたレジスタ問題と初期トラブル
- m1n1は BRINGUPモード でのみ起動可能、GXF初期化で即クラッシュ
- M4以降でGXF機能が無効化、初期化スキップで回避
- RVBAR(Reset Vector Base Address Register) 書き込みもクラッシュ要因
- 既に正しい値が入っていたため書き込みをスキップ
- USBプロキシ(m1n1 uartproxy)がlsusbで認識、シェル起動成功
Linuxカーネル起動時のデバッグ手法
- Chaos Communication Congressで再挑戦、 最小限のデバイスツリー 作成
- カーネルからの出力が得られず、 printlnデバッグ で原因調査
- m1n1のdebug_putcアセンブラルーチンを流用し、カーネル初期段階で'a'を出力
- MMU初期化 後にUARTへのアクセスが仮想アドレス化されるため出力途絶
- Linuxの初期ページテーブルを修正し、MMIO空間を1:1マッピングで解決
- 割り込みコントローラ初期化中に、 SYS_IMP_APL_VM_TMR_FIQ_ENA_EL2 レジスタ書き込みでクラッシュ
- この書き込みをコメントアウトし、シェル起動に成功
シリアル出力とデバイスツリー修正
- earlycon パラメータ追加でカーネル初期出力を取得
- デバイスツリーにstdout-path = "serial0"を追加し、詳細なログとスタックトレース取得に成功
セカンダリコアとWFI命令問題
- m1n1のsmp_start_offset設定で セカンダリコア起動 を確認
- WFI(Wait For Interrupt)命令 の仕様非準拠問題に直面
- M1〜M3ではchicken bitで回避可能だったが、M4ではロック/削除
- ARM64仕様ではWFIでアーキテクチャ状態を失ってはならない
- 一時的にカーネル内のWFI/WFIT命令をNOP化し、全コア起動に成功
- Linuxのerrataフレームワークや仮想化判定の難しさから、 bootargによるWFI idle無効化 を採用
- m1n1が該当マシンで自動的にbootargを付与
- 今後はPSCIEFI conduit等による上流対応も期待
今後の展望と支援のお願い
- Linuxが M4/M4 Pro/M4 Max/M5 で全コア起動可能に
- 周辺機器(カメラ、ディスプレイコントローラ、GPU等)のリバースエンジニアリングは進行中
- m1n1ハイパーバイザによるmacOSトレースが今後の鍵
- 作業成果は積極的に 上流プロジェクトへ還元
- Asahi Open CollectiveやLiberaPay、GitHub Sponsorsでの 寄付の呼びかけ
- Linux on Apple Siliconのさらなる発展に向けた支援の重要性
オープンなものを動かすために、オープンに反対している会社の機械を買うのは変だよね。