-
Notifications
You must be signed in to change notification settings - Fork 0
MS_KernelModeUserMode
-
TOP > インフラストラクチャ > Windows > Windows OSの基礎的トピック
- カーネルモード・ユーザモード
- メモリ管理
- ファイルシステム
- ウィンドウ・システム
-
リングには0-3のモードがあるが、UNIX、Windowsでも
0:カーネル、3:ユーザの2つのリングしか使用していない。
ユーザモードは通常のプログラムが動作するリング(モード)。
カーネルモードはOSやドライバ等のプログラムが動作するリング(モード)。
カーネルモードで動作することが許されているのは、
- OSのカーネルモジュール(ntoskrnl.exe、bootvid.dll、hal.dll、kdcom.dll)
- 各ベンダーが作成しているデバイスドライバ(
*.sys)
に限定されている。
※ 仮想化環境では、ハイパーバイザが動作する リング -1(VMX root / SVM)が加わる。 Windows でも VBS(仮想化ベースのセキュリティ)により、 カーネルモードよりさらに強い保護領域(VTL1 / セキュア カーネル)が使われている。
また、Windowsカーネルはカーネル・オブジェクトとしてサービスを提供する。
このため、カーネル・オブジェクトを使用してWindowsカーネルの提供するサービスを使用したり、ドライバ経由で処理を行うファイルIOを行う場合は、
ユーザプログラムのプロセスでも、カーネルモードのCPU時間が増加することをタスクマネージャやパフォーマンスカウンタ等から確認できる。
ntoskrnl.exeを実行するのはSystemプロセス
(Windows 2000ではPID8、XPとServer 2003ではPID 4)
であり、このプロセスはユーザーモードの実行ファイルを動作させていない。
- ntoskrnl.exe
- ntkrnlmp.exe
- ntkrnlpa.exe
- ntkrpamp.exe
※ ntkrnlpa.exe / ntkrpamp.exe は PAE 用の 32bit 版カーネル。
64bit 版 Windows のみとなった現在は ntoskrnl.exe に一本化されている。
ドライバ(*.sys)は
C:\WINDOWS\system32\drivers
に存在し、Systemプロセスから呼び出される。
-
.sys(ドライバ)のエントリポイントはDriverEntryになる。 -
.sys(ドライバ)ではDDKで公開されている
PsCreateSystemThread関数(カーネルモードでのみ呼び出し可能)でシステムスレッドを作成して、各種のI/O要求を待つ。 -
Windows ハードウェア デベロッパー センター
- カーネルモードAPI
- ネイティブAPI(仕様が公開されていない)
移行メモ: 原文はこの箇所が箇条書きの階層でずれており、 「DDKで公開されている」と「PsCreateSystemThread関数〜」が別項目になっていた。 一文として繋がる内容のため 1 項目に整えた。
-
Microsoft Windows 98 と Windows 2000 で導入されたデバイスドライバのフレームワーク
WDMドライバは以下のように分類される。
- ★ ファンクションドライバ(デバイスドライバ)
- バスドライバ(BIOS、コントローラのI/O部など)
- フィルタドライバ(デバイス動作の修正や、ウィルスチェッカ)
- ドライバ(
*.sys)は、デバイスを直接操作せず、HAL関数経由で操作する。 - デバイスは基本的にはC言語で記述されており(一部はC++)、HAL関数経由で操作すれば、
x86ベースのコンピュータでバイナリ互換、ソース互換、また、従来互換を実現する。 - 技術レポート「Windows XP用デバイスドライバの開発について」
- Windows Device Driver Programming Part 1 / Part 2
※ 現行は WDM を直接書くより、WDF(Windows Driver Frameworks) の KMDF(カーネルモード)/ UMDF(ユーザーモード)を使うのが標準。 UMDF ならユーザーモードで動くため、バグがブルースクリーンに直結しない。
ドライバ(*.sys)は、通常、ベンダのリリースする
デバイス付属のSDK(ユーザモード、DLL)経由で使用する。
※ DLLから、システムサービス、IOマネージャ経由で .sys(ドライバ)とIRP通信をする。
Tags: Windows, 障害対応, デバッグ
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。