デバイスドライバをはじめ、デバイスにかかわるお困りごとの際はお気軽にお問い合わせください。
【 デバドラ講座8 : OS、カーネル 】
デバドラ講座8では、デバイスドライバ開発に直接関わるソフトウェア、特にOSについて説明します。システムアーキテクチャとは、システムを構成する部品間の関係全体のことです。ここでソフトウェアの内部がどのように動いているのかを理解しましょう。
OS
デバドラ講座1で話したように、私たちの使用するWinsows、Mac、UNIXといったOSはアプリケーションを動かすことを目的に動いています。安全に、効率良く動作をするためにOSには様々な機能が備わっています。ドライバを動かす上で重要となる機能を以下で説明していきます。
図1はWindowsのシステム構造を表しています。
1.ユーザーモードとカーネルモード
OSには、2つのモードがあり、ソフトウェアはその2つの動作モードに分かれて動いています。重要な情報を書き換えられない為の”カーネルモード”と、アプリケーションが動いたりする”ユーザーモード”です。
1-1.ユーザーモード
ユーザーモードのソフトウェアはアプリケーションとミドルウェアに分かれます。私たちが普段使用しているWord, Excelといったソフトウェアはアプリケーションです。ミドルウェアはDLL,ActiveXの形式になっており、ユーザーモードとカーネルモードの仲介を行います。DLL(Dynamic Link Library)はWindowsにおいて複数のアプリケーションが利用する、共通のプログラムが部品のように保存されているコンポーネントです。ActiveXはインターネットエクスプローラで動的コンテンツを動作させる技術で、具体的にはMicromedeaFlashやShockwaveがあります。
1-2.カーネルーモード
カーネルモードのソフトウェアはOSとも呼ばれ、通常OSのベンダーから提供されます。デバイスドライバもカーネルモードのソフトウェアで、基本動作が標準的な規格に準拠するドライバはOSのベンダーより提供されています。しかし、あまりにも多くの種類のデバイスが存在するので、すべてのデバイスドライバをOSのベンダーが提供することはできません。通常、デバイスドライバはデバイスベンダーが開発し、デバイスと共に提供されます。Windowsの場合、OSはいくつかの管理マネージャによって構成されています。この管理マネージャをまとめてNT Executiveと呼びます。その中でも、特にIOマネージャはデバイスドライバ開発に関わりがあります。
1-3.ユーザーモードとカーネルモードの違い
ユーザーモードとカーネルモードでは、アクセス権に大きな違いがあります。カーネルモードは特権モードとも呼ばれ、アクセスに制限はありません。周辺機器、メモリ、I/O空間の全てにアクセスが可能で、CPUは全ての命令を実行することができます。Intelプラットフォームでは、I/O命令とメモリ管理命令はすべて特権命令として扱われています。一方、ユーザーモードではアクセスに多くの制限があります。ユーザーモードでは特権命令は実行できません。ユーザーモードではOSに許可されたメモリにのみアクセス可能で、周辺装置へのアクセスも制限されています。
ユーザーモードで実行されるすべての処理は、システムに悪い影響があるかどうかをチェックしてから、カーネルモードで実行されます。例えば、Wordで入力した内容を、ファイルに保存するとします。アプリケーションはファイルを保存するという要求をカーネルモードに渡してファイルを保存します。カーネルモードにデータを渡す過程で、このデータがシステムに悪い影響を与えるものかどうかの確認が行われます。安全性を確かめてから処理を行うことは、システムの安定性のためには重要な役割を果たしていますが、その分余計な時間を消費してしまいます。ユーザーモードとカーネルモードの遷移を少なくすることで、システム全体のパフォーマンスを高めることができます。
一方、カーネルモードでは処理を行う際にチェック機構は存在しません。従って、カーネルモードのソフトウェアはシステムに影響を与えるものであっても、実行することが可能です。システムの破壊を避けるためにも、カーネルモードのソフトウェア開発の際には、細心の注意を払う必要があります。デバイスドライバはカーネルモードのプログラムなので、開発の際には慎重に行わなければなりません。
2.HAL (Hardware Abstraction Layer)
Windowsはマルチプロセッサに対応するシステムとして設計されています。1台のPCに複数のプロセッサを搭載することをマルチプロセッサと言います。HALはプロセッサのパフォーマンスの違いを吸収するために存在します。ハードウェア抽象化層とも呼ばれます。
Windowsはマルチプロセッサ対応ですが、OSの中ではできるだけ特定のプロセッサに依存しない処理を行うことが要求されています。プロセッサに依存する部分はHALが処理を行い、OSに標準のインタフェースを提供します。(図2)HALには大量のアセンブリ言語のコードが含まれており”%systemroot%\system32\HAL.DLL”にHALのインタフェースファイルが保存してあります。デバイスドライバはHALの関数を呼び出し、利用します。HALは各ハードウェアプラットフォームに適した操作に変換し、ハードウェアに渡します。
HALはデバイスレジスタ、I/Oバス、割り込みの処理の管理、DMA操作の管理、システムロック、タイマー、BIOSとのインタフェースなどの処理を行います。図2にあるように、OSよりも下位に存在し、ハードウェア依存の部分を管理しています。HALは1つのPCに1つのプロセッサしか存在しない場合にも必要です。PCによってAlphaを搭載したものもあれば、PowerPCを搭載したものもあります。HALの存在のおかげで、プロセッサごとにOSを設定し直す必要がありません。
3.カーネル(Micro Kernel)
カーネルはOSのカーネル以外の部分が使うサービス群を提供しています。カーネルのサービスはプロセッサに関係なく、同じインタフェースを備えています。また、システムの基本的なアーキテクチャに必要とする機能をサポートします。プロセッサ固有の操作はHALが行います。
カーネルは割り込みの処理、処理のスケジューリングと同期、マルチプロセッサの管理、時間の管理のサービスを提供しています。割り込みの処理はHALより上位のレベルで行います。同期とは、複数のプログラムが並行して実行されている際、同じ記憶領域に同時にアクセスし、内容の整合性が失われるのを防ぐ制御のことを指します。
また、カーネルはカーネルオブジェクトとしてサービスを提供します。ここでのオブジェクトはNT Executiveのオブジェクトマネージャのオブジェクトとは違い、より低いレベルのものです。オブジェクトマネージャの基礎となるものもあります。カーネルオブジェクトはディスパッチオブジェクトとコントロールオブジェクトの二つに分けられます。
ディスパッチオブジェクトはスケジューリングと同期を行うために使います。具体的にはイベント、ミューテックス、セマフォ、タイマーがあります。イベントはオブジェクトに特定の現象が発生したときに発生する信号です。イベントを発生させないオブジェクトもあれば、数十種類のイベントを発生させるオブジェクトも存在します。ミューテックスは複数のスレッドが共有リソースに同時にアクセスしようとした場合に、1つのスレッドのみがアクセスできるように同期化させるための機能です。セマフォとは、並行して実行されているプロセス間で同期を行ったり、割り込み処理の制御を行ったりする機能です。
コントロールオブジェクトは特定の状況を制御するために使われ、OSのパフォーマンスに影響を与えます。具体的には割り込み、DPCなどがあります。DPC(Deferred Procedure Call)は遅延プロシージャコールと言い、割り込みが起こった際に使われます。割り込みが発生した際に、比較的時間がかかる操作や、優先順位が低いと判断された操作はDPCとなり処理が延期されます。DPCは優先度が低く、新しい割り込みが起こった際には、先に新しい割り込みが処理されます。
参考資料
- 「NTドライバプログラミング」
- Peter G. Viscarola、W. Anthony Mason著 久保雅俊、三浦秀朗訳 サイエンスパーク株式会社 監修
- 「Windows NTデバイスドライバプログラミング」
- アート・ベーカー著 WinProgDDK ML和訳プロジェクト訳
- 「WDMデバイスドライバ」
- Chris Cant著 エクストランス株式会社訳 サイエンスパーク株式会社 監修