ntoskrnl.exe( Windows NT オペレーティングシステム カーネル 実行可能ファイルの略) はカーネルイメージとも呼ばれ、Microsoft Windows NT カーネルのカーネル層と実行層を含み、ハードウェア抽象化、プロセス処理、およびメモリ管理を担当します。カーネル層と実行層に加えて、キャッシュマネージャ、セキュリティ参照モニタ、メモリマネージャ、スケジューラ(ディスパッチャ)、およびブルースクリーン(コードの散文と部分) が含まれています。[1]
概要
x86 バージョンの は、およびntoskrnl.exeに依存します( の x64 バリアントは、パフォーマンスを向上させるためにこれらの DLL をカーネルに埋め込みます)。ただし、 はネイティブ アプリケーションではないため、 にリンクされません。代わりに、 には、アーキテクチャに依存しないカーネル初期化関数を呼び出す独自のエントリ ポイント" KiSystemStartup " があります。 C ランタイム オブジェクトの静的コピーが必要なため、実行可能ファイルのサイズは通常約 10 MB になります。
bootvid.dllhal.dllkdcom.dllntoskrnl.exentdll.dllntoskrnl.exe
Windows XP以前では、Windows インストール ソースには、ユニプロセッサ システム、対称型マルチプロセッサ (SMP)システム、PAE対応 CPU 、および PAE 非対応 CPU をサポートする 4 つのカーネル イメージ ファイルが付属しています。Windows セットアップは、システムがユニプロセッサかマルチプロセッサかを判断し、判断した種類のカーネル イメージの PAE バリアントと非 PAE バリアントの両方をインストールします。マルチプロセッサ システムでは、セットアップによってntkrnlmp.exeと がインストールされますが、それぞれとntkrpamp.exeに名前が変更されます。
ntoskrnl.exentkrnlpa.exe
Windows Vista 以降、マルチコア CPU が市場に登場し、PAE が必須になったため、Microsoft はカーネル イメージの統合を開始しました。
Windows カーネルのアーキテクチャは、すべてが簡単に理解できるように構造化されています[説明が必要] 。関数とグローバル変数は、カーネルの各部分を区別するために、名前に特別な (追加の) プレフィックスが付いた、
いわゆるPascal Case形式を使用します。
例としては、IoCreateDeviceとObReferenceObjectByHandleがあります。両方の関数には、カーネル コード内の重要なマネージャーを区別するために異なるプレフィックス名が付けられています。IoはI/O マネージャー関数に使用され、Ob はオブジェクト マネージャー関数に使用されます。
カーネルによってエクスポートされない内部関数には、これらのプレフィックスのバリエーションが存在します。たとえば、最初の文字の後にi をKi追加する (例: “Kernel Internal”) か、プレフィックス全体にpPspを追加する (例: “Process Support Internal”) などです。
次の表にすべてのプレフィックスを示します。
初期化
カーネルが制御を受け取ると、ブートローダから構造体型のポインタを取得します。ポインタの宛先には、ハードウェアに関する情報、Windowsレジストリファイルへのパス、カーネルの動作を変更するブート設定またはオプションを含むカーネルパラメータ、ブートローダによってロードされたファイル(文字エンコード変換用のレジストリハイブ、フォント)のパスが含まれます。SYSTEM [nls 8 vga]この構造体の定義は、カーネルデバッガを使用するか、Microsoftシンボルデータベースからダウンロードすることで取得できます。[9] [ページが必要]
x86 アーキテクチャでは、カーネルはGDT、IDT、およびTSS が準備された状態で、すでに保護モードになっているシステムを受け取ります。[さらに説明が必要]しかし、カーネルはそれぞれのアドレスを知らないため、 PCR構造を埋めるためにそれらを 1 つずつロードする必要があります。[専門用語]
メイン エントリ ポイントは、ntoskrnl.exeシステム依存の初期化を実行し、システムに依存しない初期化を呼び出して、アイドル ループに入ります。[矛盾]
割り込み処理
最新のオペレーティング システムでは、デバイスからの情報を待機するために、I/O ポート ポーリングの代わりに割り込みを使用します。
x86 アーキテクチャでは、割り込みは割り込みディスパッチテーブル (IDT) を通じて処理されます。デバイスが割り込みをトリガーし、FLAGS レジスタの割り込みフラグ( IF)が設定されると、プロセッサのハードウェアは、 PICチップ (またはより新しいハードウェアではAPIC)によってIRQから変換された割り込み番号に対応するテーブルエントリで割り込みハンドラを探します。割り込みハンドラは通常、処理前にレジスタの状態のサブセットを保存し、処理が完了したら元の値に戻します。
割り込みテーブルには、ハードウェア割り込み、ソフトウェア割り込み、および例外のハンドラが含まれています。カーネルの一部のIA-32バージョンでは、このようなソフトウェア割り込みハンドラ (多数存在します) の 1 つの例は、IDT テーブル エントリ 2E 16 ( 16 進数、 10 進数では 46 ) にあり、アセンブリ言語ではシステム コールINT 2EHに使用されます。実際の実装では、エントリは(Microsoft が公開したシンボル情報による) という名前の内部サブルーチンを指します。新しいバージョンでは、代わりに命令とx86-64命令を使用する異なるメカニズムが使用されます。
KiSystemServiceSYSENTER SYSCALL
NT の割り込み処理の注目すべき特徴の 1 つは、割り込みフラグによってすべての IRQ を無効にするのではなく、通常、割り込みが優先度に基づいて条件付きでマスクされる (「IRQL」と呼ばれる) ことです。これにより、さまざまなカーネル コンポーネントが、周辺機器やその他のデバイスのサービスをブロックすることなく、重要な操作を実行できます。[10]
メモリマネージャー
物理メモリ (RAM) のアドレス範囲全体は、ページとも呼ばれる多数の小さなブロックに分割され、各ブロックのサイズは 4KB で、仮想アドレスにマップされます。各ブロックのプロパティの一部は、ページ テーブルエントリと呼ばれる構造に格納されます。これは OS によって管理され、プロセッサのハードウェアによってアクセスされます。ページ テーブルはツリー構造に編成され、最上位テーブルの物理ページ番号は制御レジスタ 3 (CR3) に格納されます。
Microsoft Windows は、仮想アドレス空間を2 つの領域に分割します。0 から始まる下部は、プロセスごとに個別にインスタンス化され、ユーザー モードとカーネル モードの両方からアクセスできます。アプリケーション プログラムはプロセスで実行され、ユーザー モードで実行されるコードを提供します。上部はカーネル モードからのみアクセス可能で、一部の例外を除き、システム全体で 1 回だけインスタンス化されます。ntoskrnl.exeは、他のいくつかのカーネル モード コンポーネントと同様に、この領域にマップされます。この領域には、カーネル モード ヒープやファイル システム キャッシュなど、カーネル モード コードによって使用されるデータも含まれます。
レジストリ
Windowsレジストリは、オペレーティングシステムやアプリケーションなどの他のソフトウェアの構成と設定情報のリポジトリです。小さなファイルに最適化されたファイルシステムと考えることができます。[11]ただし、ファイルシステムのようなセマンティクスを介してアクセスされるのではなく、カーネルモードで実装され、ユーザーモードに公開される特殊なAPIセットを介してアクセスされます。
レジストリは、「ハイブ」と呼ばれるいくつかの異なるファイルとしてディスクに保存されます。システム ハイブは、ブート シーケンスの初期に読み込まれ、その時点で必要な構成情報を提供します。ソフトウェア固有のデータとユーザー固有のデータを提供する追加のレジストリ ハイブは、それぞれシステム初期化の後の段階とユーザー ログイン時に読み込まれます。
ドライバー
ディスクからロードされるドライバーのリストは、レジストリ ハイブServices内の現在のコントロール セットのキーから取得されますSYSTEM。そのキーには、デバイス ドライバー、カーネル プロセス、およびユーザー プロセスが格納されます。これらはすべて総称して「サービス」と呼ばれ、同じ場所に混在して格納されます。
初期化中またはドライバーのロード要求時に、カーネルはそのツリーを走査して、カーネル サービスとしてタグ付けされたサービスを探します。
参照
注記
- ^ またはスイッチを介して調整可能。
/userva/3gb
Windows Internals Book 7 版に記載されているように、この機能には、起動時のオプションincreaseuservaと実行可能イメージ内の対応するヘッダーが必要です。
参考文献
- ^ Russinovich, M: システム内部のヒントとトリビア、SysInternals 情報
- ^ Microsoft Corporation (2009). 「キャッシュ マネージャー ルーチン」。Microsoft Corporation。2009年 6 月 13 日閲覧。
- ^ Microsoft Corporation (2009). 「ファイル システム ランタイム ライブラリ ルーチン」。Microsoft Corporation。2009年 6 月 13 日閲覧。
- ^ Microsoft Corporation (2009). 「I/O マネージャー ルーチン」。Microsoft Corporation。2009年 6 月 13 日閲覧。
- ^ Microsoft Corporation (2009). 「コア カーネル ライブラリ サポート ルーチン」。Microsoft Corporation。2009年 6 月 13 日閲覧。
- ^ Microsoft Corporation (2009). 「Power Manager Routines」. Microsoft Corporation . 2009-06-13閲覧。
- ^ The NT Insider (2003 年 8 月 27 日)。「Nt vs. Zw - ネイティブ API に関する混乱の解消」。OSR Online。10 ( 4 )。OSR Open Systems Resources。2013年 9 月 16 日閲覧。
- ^ 「struct LOADER_PARAMETER_BLOCK」。www.nirsoft.net。
- ^ ab X86、X64、Arm、Windowsカーネル、リバースツールを使用した実践的なリバースエンジニアリング。John Wiley & Sons Inc. 2014年。ISBN 978-1118787311。
- ^ CC Hameed (2008 年 1 月 22 日)。「IRQL とは何か、なぜそれが重要なのか? | パフォーマンス チームに質問するブログ」。Microsoft Corporation。2018年 11 月 11 日閲覧。
- ^ Tanenbaum, Andrew S. (2008).現代のオペレーティングシステム(第3版). アッパーサドルリバー、ニュージャージー: ピアソンプレンティスホール。p. 829。ISBN 978-0136006633。
さらに読む
- Tanenbaum, Andrew S. (2008)。Modern Operating Systems (第 3 版)。アッパーサドルリバー、ニュージャージー州: Pearson Prentice Hall。p. 829。ISBN 978-0136006633。
- Bruce Dang 、 Alexandre Gazet、Elias Bachaalany (2014)。実践的なリバースエンジニアリング: x86、x64、ARM、Windows カーネル、リバースツール、難読化。Wiley。p . 384。ISBN 978-1118787311。
外部リンク
- Windows Vista カーネルの内部 (TechNet マガジン)
- 構造体LOADER_PARAMETER_BLOCK
- ドライバー開発パート1: ドライバーの紹介
