
マイクロソフトが製造・販売するオペレーティングシステムのシリーズであるWindows NTのアーキテクチャは、ユーザーモードとカーネルモードという2つの主要コンポーネントで構成される階層型設計です。これは、単一プロセッサおよび対称型マルチプロセッサ(SMP)ベースのコンピュータで動作するように設計されています。入出力(I/O)要求を処理するために、I/ O要求パケット(IRP)と非同期I/Oを利用するパケット駆動型I/Oを使用します。Windows XP以降、マイクロソフトはWindowsの64ビット版の提供を開始しました。それ以前は、これらのオペレーティングシステムは32ビット版のみでした。
ユーザーモードのプログラムやサブシステムは、アクセスできるシステムリソースに制限がありますが、カーネルモードではシステムメモリや外部デバイスに無制限にアクセスできます。Windows NT のカーネルモードでは、コンピュータのハードウェアやシステムリソースに完全にアクセスできます。Windows NTカーネルはハイブリッドカーネルです。そのアーキテクチャは、シンプルなカーネル、ハードウェア抽象化レイヤー(HAL)、ドライバ、および一連のサービス (まとめてExecutiveと呼ばれます)で構成されており、これらはすべてカーネルモードに存在します。[ 1 ]
Windows NT のユーザーモードは、I/Oマネージャを使用して適切なカーネルモードデバイスドライバにI/O要求を渡すことができるサブシステムで構成されています。Windows NT のユーザーモード層は、さまざまなオペレーティングシステム向けに作成されたアプリケーションを実行する「環境サブシステム」と、環境サブシステムに代わってシステム固有の機能を実行する「統合サブシステム」で構成されています。カーネルモードは、ユーザーモードのサービスやアプリケーションが、アクセスすべきでないオペレーティングシステムの重要な領域にアクセスすることを阻止します。
エグゼクティブインターフェイスは、すべてのユーザーモードサブシステムとともに、I/O、オブジェクト管理、セキュリティ、およびプロセス管理を処理します。カーネルは、ハードウェア抽象化レイヤーとエグゼクティブの間に位置し、マルチプロセッサ同期、スレッドと割り込みのスケジューリングとディスパッチ、トラップ処理と例外ディスパッチを提供します。カーネルはまた、起動時にデバイスドライバを初期化する役割も担います。カーネルモードドライバは、最上位レベルのドライバ、中間レベルのドライバ、および低レベルのドライバの 3 つのレベルに存在します。Windows ドライバ モデル(WDM) は中間レイヤーに存在し、主にWindows 98とWindows 2000間でバイナリおよびソースの互換性を持つように設計されています。最下位レベルのドライバは、デバイスを直接制御する従来の Windows NT デバイスドライバであるか、プラグアンドプレイ(PnP) ハードウェアバスのいずれかです。
ユーザーモードは、さまざまなシステム定義プロセスとDLLで構成されています。
ユーザーモードアプリケーションとオペレーティングシステムカーネル機能間のインターフェースは、「環境サブシステム」と呼ばれます。Windows NTには、それぞれ異なるAPIセットを実装する複数の環境サブシステムが存在する場合があります。このメカニズムは、多様なオペレーティングシステム向けに作成されたアプリケーションをサポートするために設計されました。環境サブシステムはいずれもハードウェアに直接アクセスすることはできません。ハードウェア機能へのアクセスは、カーネルモードルーチンを呼び出すことによって行われます。
環境サブシステムは主に3つあります。Win32サブシステム、OS/2サブシステム、POSIXサブシステムです。[ 2 ]

Win32 環境サブシステムは、32 ビット Windows アプリケーションを実行できます。コンソールとテキスト ウィンドウのサポート、シャットダウン、および他のすべての環境サブシステムのハード エラー処理が含まれています。また、MS-DOSおよび16 ビットWindows ( Win16 ) アプリケーションを Windows NT 上で実行できるようにする仮想 DOS マシン(VDM) もサポートしています。専用の MS-DOS VDM があり、独自のアドレス空間で実行され、 MS-DOS 5.0 を実行するIntel 80486をエミュレートします。一方、Win16 プログラムは Win16 VDM で実行されます。デフォルトでは、各プログラムは同じプロセスで実行されるため、同じアドレス空間を使用し、Win16 VDM は各プログラムに実行用のスレッドを割り当てます。ただし、Windows NT では、Win16 プログラムを別の Win16 VDM で実行することもできます。これにより、プログラムはプリエンプティブ マルチタスクで実行できます。Windows NT は、実行中のアプリケーションが 1 つだけ含まれる VDM プロセス全体をプリエンプトします。 Win32環境サブシステムプロセス()には、ウィンドウ管理機能も含まれており、これは「ウィンドウマネージャ」と呼ばれることもあります。このプロセスは、キーボードやマウスからの入力イベントを処理し、その入力を受け取る必要のあるアプリケーションにメッセージを渡します。各アプリケーションは、これらのメッセージに応じて、自身のウィンドウやメニューを描画または更新する責任を負います。csrss.exe
OS/2 環境サブシステムは、16 ビット文字ベースの OS/2 アプリケーションをサポートし、OS/2 1.x をエミュレートしますが、OS/2 2.x 以降で使用される 32 ビットまたはグラフィカルな OS/2 アプリケーションは、x86 マシンでのみサポートします。[ 3 ]グラフィカルな OS/2 1.x プログラムを実行するには、Windows NT アドオン サブシステム for Presentation Manager をインストールする必要があります。[ 3 ] OS/2 サブシステムを搭載した最後の Windows NT バージョンは Windows 2000 であり、Windows XP 以降はサポートが終了しています。[ 4 ] [ 5 ]
POSIX環境サブシステムは、POSIX.1標準または関連するISO / IEC標準に厳密に準拠して記述されたアプリケーションをサポートします。このサブシステムは、 Windows Services for UNIXの一部であるInterixに置き換えられました。[ 4 ]これはさらにWindows Subsystem for Linuxに置き換えられました。
セキュリティサブシステムは、「環境システムに代わってオペレーティングシステム固有の機能を管理し、セキュリティシステムプロセスで構成されます」。このセキュリティシステムプロセスはローカルセキュリティ機関(LSA)であり、セキュリティトークンを管理し、リソース権限に基づいてユーザーアカウントへのアクセスを許可または拒否し、ログイン要求を処理してログイン認証を開始し、Windows NT によって監査する必要のあるシステムリソースを決定します。[ 6 ]また、 Active Directoryも管理します。 ワークステーションサービスは、Windows ファイルおよび印刷共有のクライアント側であるネットワークリダイレクタを実装します。これは、リモートファイルおよびプリンタへのローカル要求を、ネットワーク上の適切なサーバーに「リダイレクト」することによって実装します。[ 7 ]逆に、サーバーサービスは、ネットワーク上の他のコンピュータがローカルシステムによって提供されるファイル共有および共有プリンタにアクセスできるようにします。[ 8 ]
Windows NTカーネルモードは、コンピュータのハードウェアおよびシステムリソースに完全にアクセスでき、保護されたメモリ領域でコードを実行します。[ 9 ]スケジューリング、スレッドの優先順位付け、メモリ管理、およびハードウェアとのやり取りへのアクセスを制御します。カーネルモードは、ユーザーモードのサービスやアプリケーションが、アクセスすべきでないオペレーティングシステムの重要な領域にアクセスすることを阻止します。ユーザーモードのプロセスは、カーネルモードにそのような操作を代行するように要求する必要があります。
x86アーキテクチャは4つの異なる特権レベル(0~3)をサポートしていますが、実際に使用されるのは2つの極端な特権レベルのみです。ユーザーモードプログラムはCPL 3で実行され、カーネルはCPL 0で実行されます。これらの2つのレベルは、それぞれ「リング3」と「リング0」と呼ばれることがよくあります。このような設計上の決定は、2つの特権レベルしかサポートしないRISCプラットフォームへのコードの移植性を実現するために行われましたが[ 10 ] 、ハードウェアに直接アクセスしようとするI/O特権セグメントを含むOS/2アプリケーションとの互換性が失われます[ 3 ] 。
カーネルモードで実行されるコードには、特定のタスクを実行する多数のモジュールで構成されるエグゼクティブ、エグゼクティブが使用する低レベルサービスを提供するカーネル、ハードウェア抽象化レイヤー(HAL)、およびカーネルドライバが含まれます。[ 9 ] [ 11 ]
Windows エグゼクティブ サービスは、カーネル モードの低レベル部分を構成し、ファイル に含まれていますntoskrnl.exe。[ 9 ]これは、I/O、オブジェクト管理、セキュリティ、およびプロセス管理を扱います。これらは、キャッシュ マネージャ、構成マネージャ、I/O マネージャ、ローカル プロシージャ コール(LPC)、メモリマネージャ、オブジェクトマネージャ、プロセス構造、およびセキュリティ リファレンス モニタ (SRM)など、いくつかのサブシステムに分かれています。これらのコンポーネントをまとめて、エグゼクティブ サービス(内部名Ex ) と呼ぶことができます。システム サービス(内部名Nt )、つまりシステム コールも、パフォーマンス向上のためにカーネル レイヤーに直接呼び出すごく少数のものを除いて、このレベルで実装されています。 [ 12 ]
この文脈における「サービス」という用語は、一般的に呼び出し可能なルーチン、または呼び出し可能なルーチンのセットを指します。[ 12 ]これは、 Unix 系オペレーティングシステムのデーモンにいくらか類似したユーザーモードコンポーネントである「サービスプロセス」の概念とは異なります。[ 13 ]

カーネルはHALとExecutiveの間に位置し、マルチプロセッサ同期、スレッドおよび割り込みのスケジューリングとディスパッチ、トラップ処理と例外ディスパッチを提供します。また、起動時にオペレーティングシステムを起動するために必要なデバイスドライバを初期化する役割も担っています。つまり、カーネルは従来のマイクロカーネルのほぼすべてのタスクを実行します。Executiveとカーネルの厳密な区別は、元のマイクロカーネル設計の最も顕著な名残であり、過去の設計文書ではカーネルコンポーネントを一貫して「マイクロカーネル」と呼んでいます。
カーネルはプロセスマネージャとよくインターフェースします。[ 27 ]抽象化のレベルは、カーネルがプロセスマネージャを呼び出すことはなく、逆方向のみである(ごく少数の特殊なケースを除いて、それでも機能的な依存関係にはなりません)。
Windows NT の設計には、マイクロカーネルシステムの典型例であるMachと同じ目標が数多く含まれており、最も重要なものの 1 つは、よく知られたインターフェースを介して通信するモジュールの集合体としての構造であり、マイクロカーネルは第 1 レベルの割り込み処理、スレッド スケジューリング、同期プリミティブなどのコア機能に限定されています。これにより、モジュール間の通信に直接プロシージャ呼び出しまたはプロセス間通信(IPC) のいずれかを使用することが可能になり、モジュールを異なるアドレス空間 (たとえば、カーネル空間またはサーバ プロセス) に配置する可能性が生まれます。Mach と共有するその他の設計目標には、多様なアーキテクチャのサポート、複数のオペレーティングシステム パーソナリティをその上に実装できるほど汎用的な抽象化を備えたカーネル、およびオブジェクト指向の構成が含まれます。[ 10 ] [ 28 ]
Windows の主要なオペレーティングシステムのパーソナリティは、常に存在するWindows APIです。Windows パーソナリティを実装するエミュレーションサブシステムは、クライアント/サーバーランタイムサブシステム( csrss.exe) と呼ばれます。NT 4.0 より前のバージョンでは、このサブシステムプロセスにはウィンドウマネージャ、グラフィックスデバイスインターフェイス、およびグラフィックスデバイスドライバも含まれていました。しかし、パフォーマンス上の理由から、バージョン 4.0 以降では、これらのモジュール (特に内部グラフィックスサポートなしで設計されたモノリシックシステムでもユーザーモードで実装されることが多い) はカーネルモードサブシステムとして実行されます。[ 10 ]
NT 上で動作するアプリケーションは、OS パーソナリティ (通常は Windows API) のいずれかに記述され、ドキュメントが公開されていないネイティブ NT API には記述されません (デバイス ドライバ開発で使用されるルーチンを除く)。OS パーソナリティは、ユーザー モード DLL のセット (ダイナミック リンク ライブラリを参照) を介して実装され、必要に応じてアプリケーション プロセスのアドレス空間にマッピングされます。また、エミュレーション サブシステム サーバー プロセス (前述のとおり) も使用されます。アプリケーションは、アドレス空間にマッピングされた OS パーソナリティ DLL を呼び出すことでシステム サービスにアクセスします。ntdll.dllこれらの DLL は、プロセス アドレス空間にマッピングされた NT ランタイム ライブラリ ( ) を呼び出します。NT ランタイム ライブラリは、カーネル モードにトラップしてカーネル モードのエグゼクティブ ルーチンを呼び出すか、適切なユーザー モード サブシステム サーバー プロセスにローカル プロシージャ コール(LPC) を行うことで、これらの要求を処理します。これらのプロセスは、NT API を使用してアプリケーション プロセス、カーネル モード サブシステム、および相互に通信します。[ 29 ]
Windows NT は、カーネルモードのデバイスドライバを使用してハードウェアデバイスとやり取りします。各ドライバには、オペレーティングシステムの他の部分にエクスポートされる、明確に定義されたシステムルーチンと内部ルーチンがあります。すべてのデバイスは、ユーザーモードのコードからは I/O マネージャ内のファイル オブジェクトとして認識されますが、I/O マネージャ自体からはデバイス オブジェクトとして認識され、I/O マネージャはそれをファイル、デバイス、またはドライバ オブジェクトとして定義します。カーネルモードのドライバは、最上位レベルのドライバ、中間レベルのドライバ、および下位レベルのドライバの 3 つのレベルに存在します。FATやNTFSのファイルシステム ドライバなどの最上位レベルのドライバは、中間レベルのドライバに依存します。中間レベルのドライバは、オプションで下位レベルと上位レベルのフィルタ ドライバの間に挟まれる機能ドライバ (デバイスのメイン ドライバ) で構成されます。機能ドライバは、バス ドライバ (バスコントローラ、アダプタ、またはブリッジを処理するドライバ) に依存します。バス ドライバには、オプションで機能ドライバとの間に配置されるバス フィルタ ドライバがあります。中間レベルのドライバは、機能するために最下位レベルのドライバに依存します。Windowsドライバ モデル(WDM) は中間層に存在します。最も低レベルのドライバは、デバイスを直接制御する従来のWindows NTデバイスドライバか、PnPハードウェアバスのいずれかです。これらの低レベルドライバはハードウェアを直接制御し、他のドライバに依存しません。

Windows NTのハードウェア抽象化レイヤー(HAL)は、コンピュータの物理ハードウェアとオペレーティングシステムの残りの部分との間のレイヤーです。これは、ハードウェアの違いを隠蔽し、カーネルが実行される一貫したプラットフォームを提供するために設計されました。HALには、I/Oインターフェイス、割り込みコントローラ、およびマルチプロセッサを制御するハードウェア固有のコードが含まれています。
しかし、HALはアーキテクチャ内での目的や位置づけに関わらず、カーネルがExecutiveの下位に位置するのと同様に、カーネルの下位に位置するレイヤーではありません。既知のHAL実装はすべて、何らかの形でカーネル、あるいはExecutiveに依存しています。実際には、これはカーネルとHALのバリアントが、連携して動作するように特別に構築された、対応するセットとして提供されることを意味します。
特に、ハードウェア抽象化は命令セットの抽象化を伴いません。命令セットの抽象化は一般的に移植性というより広い概念に含まれます。命令セットの抽象化は、必要に応じて(例えば、x86命令セットの複数の改訂に対応するため、または欠落している数学コプロセッサをエミュレートするためなど)、カーネルによって、またはハードウェア仮想化によって実行されます。
HALは[ 30 ]hal.dllで実装されています。HALは、さまざまなハードウェアプラットフォームによって異なる方法で実装される多数の機能を実装しています。この文脈では、これは主にチップセットを指します。オペレーティングシステム内の他のコンポーネントは、実際の実装に関係なく、すべてのプラットフォームで同じ方法でこれらの機能を呼び出すことができます。
例えば、割り込みへの応答方法は、APIC(Advanced Programmable Interrupt Controller)を搭載したマシンと搭載していないマシンでは大きく異なります。HAL(ハードウェア抽象化レイヤー)は、様々なチップセットによるあらゆる種類の割り込みに対応する単一の関数を提供することで、他のコンポーネントがこれらの違いを気にしなくて済むようにしています。
HAL はカーネルのアドレス空間にロードされ、カーネルモードで実行されるため、HAL のルーチンはアプリケーションから直接呼び出すことができず、HAL ルーチンに直接対応するユーザーモード API もありません。代わりに、HAL は主に Windows のエグゼクティブおよびカーネル、そしてカーネルモードのデバイスドライバにサービスを提供します。ほとんどのハードウェアのドライバは、一般的に.sysファイルタイプの他のファイルに含まれていますが、いくつかのコアドライバは にコンパイルされますhal.dll。
PCIやPCI Expressなどのバス上のデバイス用のカーネルモードデバイスドライバは、HAL内のルーチンを直接呼び出して、デバイスのI/Oポートやレジスタにアクセスします。ドライバがHALルーチンを使用するのは、プラットフォームによってこれらの操作の実装が異なる場合があるためです。HALは各プラットフォームに合わせて操作を適切に実装するため、同じCPUアーキテクチャを使用するすべてのプラットフォームで同じドライバ実行ファイルを使用でき、ドライバソースファイルはすべてのアーキテクチャ間で移植可能です。
Windows 8より前のx86システムでは、インストール メディアに複数の異なる HAL ファイルがあります。Windows のインストール手順では、現在のプラットフォームに適した HAL ファイルを判断し、必要に応じて名前を変更してハード ドライブにコピーします。この選択の基準には、ACPI互換 BIOS の存在、 APICの存在、および複数のプロセッサが存在して有効になっているかどうかが含まれます。(マルチ コア CPUの複数のコア、およびハイパースレッディングCPUによって実装される「論理プロセッサ」もすべて、この目的においては「プロセッサ」としてカウントされます。)x86-64およびItaniumプラットフォームでは、各 CPU アーキテクチャに対して可能なのは 1 つだけです。Windows 8 以降では、x86 バージョンにも HAL は 1 つしかありません。hal.dllhal.dll
HALはWindows 10のバージョン2004以降ntoskrnl.exe[ 31 ]に統合(または静的にリンク)されており、DLLは後方互換性のためのスタブとしてのみ機能します。
ブートシーケンスは、Vista より前のバージョンではNTLDRによって、 Vista 以降ではWindows Boot Managerによって開始されます。 [ 32 ]ブートローダーは、ブートドライブ上のファイルシステムにアクセスし、 を起動してntoskrnl.exe、ブート時のデバイスドライバをメモリにロードする役割を担います。すべてのブートドライバとシステムドライバがロードされると、カーネルはセッションマネージャサブシステムを開始します。セッションマネージャは、クライアント/サーバーランタイムサブシステムなど、Win32 サブシステムの重要なカーネルおよびユーザーモードサービスを開始します。セッションでは、ユーザーがログインしてアカウントを使用できるようにするプロセスwinlogonも実行されます。
{{cite web}}: CS1 maint: url-status (リンク)