このページでは、各カーネル リリースの主な機能を説明し、追加情報へのリンクを掲載しています。
カーネル 6.12 の新機能
このセクションでは、カーネル 6.12 の新機能について説明します。
メモリ割り当てプロファイリング
メモリの使用を把握する鍵は、どこで割り当てが行われているかを知ることにあります。カーネル 6.12 には、メモリ割り当てプロファイリング(構成内の CONFIG_MEM_ALLOC_PROFILING
)という新しいメモリ割り当てアトリビューション システムが含まれています。メモリ割り当てプロファイリングで、割り当てはそれぞれ一意のソース行に関連付けられるため、割り当てに関する問題をすぐに特定できます。メモリ割り当てプロファイリングには、他にも次のような特徴があります。
使用するのはエンジニアリング フェーズのときですが、標準の GKI イメージで利用できます。
sysctl.vm.mem_profiling
起動パラメータを使用して有効にできます。カーネル内と読み込みモジュールのどちらでも動作します。
ゼロコピーとマルチショット読み取りによる io_uring の高速化
カーネル 6.12 では、statsd
モジュールと logd
モジュールが sendfile ゼロコピーを使用することで、パフォーマンスを向上させています。
また、このカーネル バージョンは、1 回の読み取り操作で同時に複数のデータを取得できるマルチショット読み取りも実装しており、これもパフォーマンスの向上につながっています。
Berkeley Packet Filter(BPF)機能とサポートの改善
カーネル 6.12 では、CO-RE と複数の最新機能をサポートするよう BPF ツールチェーンが移動しました。また、新しい BPF ローダにより、AOSP に含まれるプログラムに最新の BPF を使用できるようになりました。
プロキシの実行
プロキシの実行により、スケジューラは、優先順位の低いプロセスで保持されているロックを復元するため、優先順位の高いプロセスから CPU サイクルを借りることができます。この機能により、優先順位逆転の問題が軽減されます。
カーネル 6.6 の新機能
このセクションでは、カーネル 6.6 の新機能について説明します。
Rust のサポート
カーネル 6.6 の複数のプロジェクトで Rust が使用されています。
仮想メモリ領域(VMA)ごとのロック
カーネル 6.6 は、仮想メモリ領域ごとのロックを使用して mmap_sem
(以前の mmap_lock
)との競合問題を解決しています。そのため、非常に多くのスレッドを使用するアプリで、起動時間を 20% も短縮できる可能性があります。
Earliest Eligible Virtual Deadline First(EEVDF)スケジューラから CFS への置換
EEVDF を Completely Fair Scheduler(CFS)に置き換えたことで、実行時間の短いタスクと長いタスク間の CPU アクセスのバランスが改善されています。
リード コピー アップデート(RCU)コールバックからの電力消費の削減
RCU_LAZY
オプションを指定すると、タイマーベースの RCU コールバック バッチ処理メソッドを使用して電力使用量を削減できます。負荷が軽いシステムやアイドル状態のシステムでは、このオプションで電力消費を 5%~10% 削減できます。
ZRAM メモリ圧縮の向上
新しい CONFIG_ZRAM_MULTI_COMP
ビルド設定により、ZRAM は 3 つある代替アルゴリズムのいずれかでページを再圧縮できます。この再圧縮により、圧縮されたメモリがさらに圧縮されるため、アクティブ タスク用の空き容量を増やすことができます。
カーネル 6.1 の新機能
このセクションでは、カーネル 6.1 の新機能について説明します。
カーネル制御フローの整合性(KCFI)によるセキュリティの高速化
制御フローの整合性(CFI)に代わって KCFI が使用されるようになったことで、実行時のコストが削減され、ビルド時のコストがなくなりました。実行時のコストの削減により、CFI に比べて多くの場所で、特にトレースポイントやベンダーフックなどで、KCFI を有効にできます。
KCFI のほかに、カーネル 6.1 には、厳しい memcpy
境界チェック機能や直線的推測の攻撃緩和機能など、さまざまなセキュリティ機能が導入されています。
KCFI について詳しくは、カーネル制御フローの整合性をご覧ください。
Multi-Generational LRU(MGLRU)
MGLRU がカーネル 6.1 に追加されたことで、どのページが実際に使用されているかを適切に特定でき、メモリ管理が改善されました。この改善により、システムでメモリ不足が発生した際にアプリを停止する必要が少なくなります。今回のアップデートでは、全体的なデバイスの反応が良くなったことから、ユーザー エクスペリエンスも改善されています。
また、MGLRU の実装により、新しい RCU セーフのメイプルツリーもサポートされるようになり、場合によって、レッドブラック ツリー(rbtree)の代わりに使用することもできます。RCU セーフのメイプルツリーを使用すると、フットプリントが削減されロックが不要になることからパフォーマンスが向上します。
MGLRU について詳しくは、Multi-Gen LRU をご覧ください。
スケジュール
スケジューラの保守と更新は、カーネルを改善する取り組みの主要な目的の一つです。カーネル 6.1 では、以下のように改善されています。
- クラスタ認識スケジュール機能を追加して、L2 キャッシュを共有するコアに移行することでパフォーマンスを向上させました。
- 不要なエネルギー マージン ヒューリスティックを削除しました。一部の移行を制限することで、このアップデートによりエネルギー利用量が最大 5% 改善されています。
- ロード バランシングを改善して wakeup 遅延を削減しました。
- RCU 短縮猶予期間をリアルタイムの kthread に移行しました。このアップデートにより、RCU 関連の遅延の外れ値が大幅に減少しました。
グラフィック
カーネル 6.1 には、Vulcan Video API の必要性に合わせて、同期ファイルをエクスポート / エクスポートするための dma-buf の新しいメソッドが含まれています。
新しい futex_waitv()
メソッドにより、複数の futex を同時に待つことで他のプラットフォームからのゲームの移植が簡素化されます。
デバッグツール
デバッグビルドで Kernel Concurrency SANitizer(KCSAN)を使用して、カーネルコード内の競合を特定します。
また、Kernel Memory SANitizer(KMSAN)を使用して、カーネル内で初期化されていない値を探すこともできます。
ARM64 サポートの改善
カーネル 6.1 では、次のように ARM64 アーキテクチャが改善されます。
- ARMv8.6 タイマー拡張機能のサポート
- QARMA3 ポインタ認証アルゴリズムのサポート
- ARMv9 Scalable Matrix Extension(SME)の初期サポート
- 代替機能のパッチ適用の改善によるカーネル イメージ サイズの縮小化