ハイライト
Apple は、Apple シリコン Mac の SoC、ユニファイド メモリ、AMP スケジューリング、セキュア ブート、ロゼッタ、リカバリ プロセスについて説明し、Metal、Core ML、GCD、DriverKit、Rosetta 検出に関する macOS アプリの移行エントリ ポイントを提供します。
主要内容
Intel Mac では、CPU、GPU、T2、ディスクリート グラフィックス メモリ、および周辺機器のアクセス パスがさまざまなコンポーネントに分散されています。個別の GPU を搭載したマシンは、テクスチャ、イメージ、ジオメトリ データを CPU メモリと GPU メモリの間で移動する必要もあります。 Apple Silicon Mac では、これらの機能が同じ SoC に組み込まれています。 CPU と GPU は同じユニファイド メモリ セットにアクセスし、グラフィック リソースを直接共有できます。
開発者が最初に問うべき質問は現実的なものです。それは、既存のアプリのどの部分を書き直す必要があるのかということです。このセッションに対する答えは非常に抑制的でした。 Apple は開発者にまったく新しいプラットフォーム API セットへの切り替えを要求するのではなく、Metal、AVFoundation、VideoToolbox、Core ML、Accelerate、Compression、SIMD、Grand Central Dispatch を継続的に使用することを強調しています。違いは、これらのフレームワークがすでに Apple シリコン用に最適化されているということです。
2 番目の実際的な問題は互換性です。 Rosetta は既存の x86_64 アプリを実行し、翻訳結果は署名され、単一のマシンにバインドされ、安全に保存されます。 Xcode、Instruments、LLDB は、翻訳されたアプリのデバッグと分析もサポートしています。ネイティブ移行が依然として目標ですが、Rosetta はユーザーとチームに移行期間を与えます。
基盤となるシステムには新しい制約もあります。書き込み XOR 実行、カーネル整合性保護、ポインター認証、およびデバイス分離は、JIT、カーネル拡張機能、および PCIe ドライバーに影響します。ドライバー開発者の場合、古い物理アドレス アクセス パスを IOMapper および IODMACommand に移行する必要があります。長期的な方向性は、DriverKit をできるだけ早く評価することです。
起動と回復のプロセスも変更されました。 Apple シリコン Mac は、iOS および iPadOS セキュア ブートに基づくアーキテクチャを使用しており、スタートアップ チェーンのすべてのステップで Apple 署名検証に合格する必要があります。起動オプションは起動ボタンを統合し、macOS 回復は起動ディスク、セキュリティ ポリシー、Mac 共有モード、および回復ツールを担当します。
詳細
1. メモリとプラットフォームのフレームワークを統合する
(01:00) Apple シリコン Mac は、CPU、GPU、ビデオ コーデック、ニューラル エンジン、機械学習アクセラレータを 1 つの SoC に搭載しています。ユニファイド メモリを使用すると、CPU と GPU がグラフィック リソースを共有できるため、PCIe バス経由でデータをコピーするオーバーヘッドが排除されます。
(02:40) 開発者は依然として既存のフレームワークを使用してこれらのハードウェア機能にアクセスしています。グラフィック作業には Metal を使用します。ビデオのエンコードとデコード用の AVFoundation と VideoToolbox。機械学習用の Core ML または Accelerate。 Core ML では、モデルを明示的に次のように設定することは避けるべきです。cpuOnlyまたはcpuAndGPU、させてcomputeUnitsデフォルトのままにするall、ニューラル エンジンまで実行する機会があります。
キーポイント:
- Apple の移行推奨は、チップの詳細ではなく、フレームワークのエントリから始まります。
- Metal、AVFoundation、VideoToolbox、Core ML、および Accelerate は、トランスクリプトによって明示的に指定されたエントリ ポイントです。
- Core ML アプリの場合は、まず構成でコンピューティング ユニットが CPU または CPU+GPU に制限されているかどうかを確認します。
2. AMP のスケジューリングと並列作業
(04:42) Apple シリコン Mac は、同じマシン内にパフォーマンス コアと効率コアの両方を備えた非対称マルチプロセッシング (AMP) を使用します。 macOS は、タスクのパフォーマンス要件に基づいて、適切なコアへの作業をスケジュールします。
(04:46) 開発者は、すべての作業項目に対してサービス品質 (QoS) を設定する必要があります。 QoS は、このジョブが最大のパフォーマンスを実現するためのものなのか、それともエネルギー効率を優先する方が良いのかを macOS に伝えます。この信号は、タスクが AMP システム上でどのタイプのコアに該当するかに影響します。
(05:26) Grand Central Dispatch では並行作業が推奨されます。concurrentPerformこのような API は、システムがさまざまなパフォーマンス特性を持つコアにタスクを割り当てるのに役立ちます。システムに負荷分散のための余地があるように、タスク分割に十分な反復が必要です。
キーポイント:
- QoS をパフォーマンスとエネルギー効率の目的の一部として扱い、バックグラウンド キューに無計画に設定しないでください。
- マルチコア分割をGCDに引き継ぐことで、手書きスレッド割り当て時のコア性能差の判断ミスを軽減できます。
- AMP システムが効果的にワークロードのバランスを取れるように、大きなタスクは十分な断片に分割する必要があります。
3. セキュリティ モデルと PCIe ドライバー
(07:11) Apple シリコンでは書き込み XOR 実行が強制され、メモリ ページの書き込みまたは実行は可能ですが、同時に両方の状態になることはできません。 Java や JavaScript などの JIT コンパイラをサポートするために、Apple はスレッド レベルで書き込み可能権限と実行可能権限をすばやく切り替えることができる新しい API を追加しました。
(08:13) カーネル整合性保護により、ロード後にカーネル コードが不変になり、ポインター認証により、認証コードが 64 ビット ポインターの空きビットに入れられ、ポインターの誤用が防止されます。 Apple は当時、カーネル、システム アプリ、およびシステム サービスでポインター認証を有効にしていましたが、サードパーティ アプリがこの方法でリリースされることをまだ許可していませんでした。
(09:14) デバイス分離により、PCIe デバイスがメモリにアクセスする方法が変わります。 Intel Mac では、デバイスはシステム メモリ ビューを共有します。 Apple Silicon Mac では、各デバイスに個別のメモリ マッピングが与えられ、デバイスが本来アクセスすべきメモリにのみアクセスするように制限されます。
公式の PCIe DMA 設定フラグメントは次のとおりです。
// Get the IOMapper for the device
IOMapper *mapper = IOMapper::copyMapperForDevice(device);
// Use an IODMACommand; pass the mapper when initializing
IODMACommand *dmaCommand = IODMACommand::withSpecification(
outSegFunc, numAddressBits, maxSegmentSize, mappingOptions,
maxTransferSize, alignment, mapper, refCon);
// Keep the IODMACommand prepared for the duration of the i/o
キーポイント:
IOMapper::copyMapperForDevice(device)Apple シリコンの分離メモリ ビューに一致するマッパーを現在のデバイスから取得します。IODMACommand::withSpecification(...)初期化中にマッパーを渡して、DMA コマンドが新しいマッピング パスを使用できるようにします。- 古いドライバーの直接ペアリング
ioMemoryDescriptor調子を整えるgetPhysicalSegmentこのパスはこのプラットフォームでは使用できません。 - カーネル拡張機能は引き続き利用可能ですが、ロード方法、ユーザーの負担の増加、およびポインター認証要件のすべてにより、ドライバーの DriverKit への移行が促進されます。
4. Rosetta の翻訳と診断
(11:31) Rosetta は、既存の x86_64 アプリを実行するために使用されます。 macOS アプリ、Catalyst アプリ、ゲーム、および JIT コンパイラーが組み込まれた複雑なアプリをカバーします。 Metal を使用して翻訳されたアプリは Apple GPU 用のコマンドを生成し、Core ML を使用して翻訳されたアプリは Neural Engine 上で実行することもできます。
(12:08) Rosetta は、App Store またはパッケージ インストーラーがインストールをトリガーすると、実行可能コードの変換を開始します。翻訳製品はコード署名され、単一のマシンにバインドされ、安全に保存され、システムの更新後に更新されます。システムは起動時に保存された翻訳をロードします。実行時に未翻訳のコードが見つかった場合、Rosetta はそのコードをその場でコンパイルします。
(13:37) ネイティブ Apple シリコン プロセスと Intel Mac プロセスには、ページ サイズ、メモリ順序規則などの違いがあります。mach_absolute_time周波数と部分的な浮動小数点の動作。 Rosetta は、変換されたプロセスを Intel Mac の動作と一致させますが、x86 AVX ベクトル拡張子はサポートしません。
公式の Rosetta 検出スニペットは次のとおりです。
// Use "sysctl.proc_translated" to check if running in Rosetta
// Returns 1 if running in Rosetta
int processIsTranslated() {
int ret = 0;
size_t size = sizeof(ret);
// Call the sysctl and if successful return the result
if (sysctlbyname("sysctl.proc_translated", &ret, &size, NULL, 0) != -1)
return ret;
// If "sysctl.proc_translated" is not present then must be native
if (errno == ENOENT)
return 0;
return -1;
}
キーポイント:
- 戻る
1現在のプロセスが Rosetta で実行されていることを示します。 sysctl.proc_translated存在しない場合、コードは結果をネイティブとして扱います。- この検出は、診断、ロギング、および互換性テストのパスを追加するのには適していますが、ネイティブ移行を回避するのには適していません。
- AVX を必要とするコード パスは、システム機能を使用して引き続きチェックする必要があり、Rosetta が AVX をオーバーライドするとは想定しません。
5. 起動、セキュリティポリシー、リカバリ
(16:00) Apple Silicon Mac の起動プロセスは、iOS および iPadOS のセキュア ブート アーキテクチャに基づいています。各起動コンポーネントは Apple によって暗号署名される必要があり、起動前に信頼チェーン全体が検証される必要があります。
(16:46) 起動エントリは起動オプションに統合されました。 Mac ノートブックの Touch ID ボタン、またはデスクトップ コンピューターの電源ボタンを押し続けると、このインターフェイスに入ることができます。 macOS Recovery は、スタートアップ マネージャー、起動ディスク、セキュリティ ポリシー、および回復ツールを 1 つの UI にまとめます。
(17:38) Mac 共有モードはターゲット ディスク モードを置き換え、SMB ファイル共有を使用してファイル レベルのアクセスを提供し、ユーザー認証を必要とします。起動ディスクは、macOS がインストールされているボリュームごとに、完全なセキュリティまたは軽減されたセキュリティを選択できるようになりました。
(19:34) Intel Mac のアクティブなセキュリティ ポリシーはマシン全体に影響します。 Apple Silicon Mac は、macOS インストールごとに独立したセキュリティ ポリシーを維持します。開発またはテスト システムのセキュリティ レベルを下げても、日常のシステムでは完全なセキュリティを維持できます。
(21:53) Apple シリコン Mac にはシステム リカバリが導入されています。これは、別の非表示のコンテナーにインストールされる最小限の macOS 環境で、macOS Recovery 自体が利用できない場合に macOS と macOS Recovery を再インストールするために使用されます。 Apple Configurator 2 は、システム リカバリも利用できないシナリオで引き続き使用されます。
キーポイント:
- 外部ディスクから起動する場合、マシン全体のセキュリティ レベルを下げる必要がなくなりました。
- セキュリティの低下は、カーネル拡張機能の開発、研究、および特定のワークフロー向けに構成可能なモードです。
- サポート ドキュメントでは、macOS リカバリ、システム リカバリ、Apple Configurator 2 の 3 層リカバリ パスを区別しています。
重要ポイント
-
Apple シリコン移行チェック ページを作成します: やるべきこと: macOS アプリのデバッグ ビルドでの Metal、AVFoundation、VideoToolbox、Core ML、Accelerate、および GCD の使用状況をリストします。実行する価値がある理由: Session は、これらのフレームワークを Apple シリコン機能への入り口として明示的に使用します。開始方法: Core ML を確認する
computeUnits次に、キューの QoS と、並列化可能なタスクがハンドオーバーに適しているかどうかを確認します。concurrentPerform。 -
組み込みスクリプト エンジンに JIT セーフティ モードを追加: 対処方法: Java、JavaScript、または自社開発スクリプト エンジンの JIT メモリ管理を独立したモジュールにカプセル化します。実行する価値がある理由: write XOR 実行では、メモリ ページが同時に書き込み可能であることと実行可能であることができない必要があります。 Apple は、スレッド レベルで権限を迅速に切り替えるための新しい API を提供しています。開始方法: まず、コードの生成、権限の切り替え、コードの実行の 3 つのステップに分けて、マルチスレッド JIT でスレッドごとに権限を切り替える準備をします。
-
ドライバー移行レポート ツールの作成: 機能: PCIe または SCSI ドライバーをスキャンし、それらを直接呼び出します
getPhysicalSegmentDMA パス。実行する価値がある理由: Apple シリコンのデバイス分離にはデバイスレベルのメモリ マッピングが必要であり、古いパスは機能しません。開始方法: デバイスから取得するようにターゲット パスを変更します。IOMapper、次にマッパー付きのものを使用しますIODMACommandDriverKit の移行を評価しながら DMA を管理します。 -
互換性テスト用に Rosetta をタグ付け: 対処方法: プロセスがアプリの診断ログの Rosetta で実行されているかどうかを記録します。実行する価値がある理由: ページ サイズ、メモリの順序、
mach_absolute_time周波数と浮動小数点の詳細はネイティブ プラットフォームによって異なり、Rosetta は Intel Mac の動作をエミュレートします。開始方法: 使用するsysctl.proc_translated変換ステータスを検出し、AVX 機能チェックを起動セルフテストに組み込みます。 -
サポート チーム用にリカバリ パス ウィザードを作成します: 対処方法: スタートアップ オプション、Mac 共有モード、完全なセキュリティ、セキュリティの低下、システム リカバリ、および Apple Configurator 2 をトラブルシューティング プロセスにします。実行する価値がある理由: Apple Silicon Mac のリカバリ ポリシーとセキュリティ ポリシーはボリュームごとに管理されているため、ユーザーはどのレイヤーで操作すべきかを必ずしも知っているわけではありません。開始方法: 一般的な問題を、ブート ディスクの選択、ファイルの取得、カーネル拡張機能のインストール、システムの回復の 4 つのカテゴリに分類します。
関連セッション
- Mac アプリを Apple シリコンに移植する — 既存の macOS アプリを再コンパイルし、ユニバーサル アプリを構築し、低レベルのコードとプラグインの移行を処理する方法を続けます。
- Apple Silicon Mac 上の iPad および iPhone アプリ — iOS および iPadOS アプリが Apple Silicon Mac 上でどのようにテスト、適応、配布されるかについて説明します。
- Metal アプリを Apple シリコン Mac に導入する — Apple シリコン Mac の TBDR GPU アーキテクチャを導入することは、Metal の移行を理解するための前提条件です。
- Apple シリコン Mac 向けのメタル パフォーマンスの最適化 - Apple GPU でのワークロード スケジューリング、レンダリング パイプライン、シェーダーの最適化についての詳細な説明。
- DriverKit を使用して PCI ドライバーと SCSI ドライバーを最新化する — PCI ドライバーと SCSI ドライバーが DriverKit を使用してカーネル空間の外に移動する方法について説明します。
コメント
GitHub Issues · utterances