ntoskrnl.exe (Windows NT operating system kernel の略) またはカーネルイメージ (kernel image) とは、Windows NTカーネル空間のカーネルおよびエグゼキュティブ・レイヤー(実行層)であり、ハードウェア仮想化、プロセスおよびメモリ管理、といった様々なシステムサービスを受け持ち、システムの基本的な部分を構成する[1]。
ntoskrnl.exeは上層の「エグゼキュティブ」と下層の「カーネル」から構成される。エグゼキュティブはI/O、オブジェクト、セキュリティ、プロセス、プロセス間通信 (IPC)、仮想メモリ、ウィンドウおよびグラフィックの管理を司る。カーネルはスレッドスケジューリング、第1レベル割り込みハンドリング、遅延プロシージャコール (Deferred Procedure Calls ; DPC) などの基本的なオペレーティングシステムサービスを提供する[2]。
Windowsカーネルは変数名でなく型名を表すハンガリアン記法を用いてコーディングされている。ntoskrnlのファンクション名はそのコンポーネントを示すプリフィクス(接頭辞)によって定義される。そのうちの一部を次の表に掲げる。
接頭辞 | 意味 |
---|---|
Cc | ファイルシステムキャッシュ[3] |
Cm | コンフィグレーション・マネージャ[4] |
Ex | Windowsエグゼキュティブ[5]、ntoskrnl.exeの「外部レイヤー」 |
FsRtl | ファイルシステム・ランタイムライブラリ[6][7] |
Io | I/Oマネージャー[8] |
Ke | コア・カーネル・ルーチン[9][7] |
Lsa | ローカル・セキュリティ認証[7] |
Mm | メモリ管理[7] |
Ob | オブジェクト・マネージャー[7] |
Pf | Prefetcher[7] |
Po | プラグ・アンド・プレイおよび電源管理[10][7] |
Ps | プロセスおよびスレッド管理[7] |
Rtl | ランタイムライブラリ[7]、これはネイティブアプリケーションで使われる多くのファンクションを含む |
Se | セキュリティ[7] |
Vf | ドライバ署名[7] |
Zw | NtおよびZwはntdll.dllとntoskrnl.exeで宣言されているシステムコール。ユーザーモードのntdll.dllから呼び出されたとき、これらのグループはカーネルモードにトラップしてSSDT (System Service Dispatch Table) を通じてntoskrnl.exeの同等のファンクションを呼び出す。ntoskrnl.exeのファンクションを直接呼び出したとき、Zwはカーネルモードを確保するのに対し、Ntは確保しない[11]。接頭辞のZwは特に意味を持たない[12]。 |
カーネルは制御を受け取る時に、パラメーターである構造体へのポインタを受け取る。この構造体はブートローダーによって受け渡され、ハードウェアに関する情報、レジストリファイルへのパス、カーネルの挙動を変更するブート設定またはオプションのカーネルパラメータ、ブートローダーによって読み込まれるファイルパスの情報を含んでいる[13][14]。この構造体の定義はカーネルデバッガを使用するか、またはマイクロソフトのシンボルデータベースからダウンロードすることで取得することができる[15]。
x86アーキテクチャでは、カーネルはシステムが既にプロテクトモードにあり、GDT (Global Descriptor Table)、IDT (Interrupt descriptor table)およびTSS (Task State Segment)の準備が済んでいることを受け取る。カーネルはドライバ署名、メモリマネージャー、IDTといった各種リソース・コンポーネントの初期化処理を行い、最後にセッションマネージャー サブシステム (SMSS)が問題なく起動したことを確認して初期化処理を終える[16]。
Windows Server 2003 SP1以降の64ビット版Windowsには Kernel Patch Protection (PatchGuard) という数分おきにカーネルなどのシステム構造への改変をチェックする機構が備わっている[17][18]。改変が検出された時、Windowsはブルースクリーンに移行してシステムを停止する。しかし、マルウェアの中にはカーネルの起動前に読み込まれるプログラム(ブートセクタなど)に感染することで、この保護機構を回避してカーネルを改ざんするブートキット (Bootkit) と呼ばれる種類が存在する[19]。このような脆弱性に対してはUEFIのセキュアブートやTPMを利用してRoot of Trust(信頼性の根幹)を確立することが有効である[20]。