ユーザーインタフェースの裏側で、Windows 7はどのように動作しているのでしょうか。ここからは、プログラミングをする上で知っておきたいWindows 7の内部構造を見ていきましょう。これから説明する内部構造により、Windows 7の特徴である「新しいユーザーインタフェース」や「動作の軽快さ」などが実現されています。

 Windows 7に限りませんが、現在のOSは様々な機能を備えています(表1)。プログラマの皆さんに身近なのは、アプリケーション・プログラミングインタフェース(API)でしょう。Windowsの場合は、.NET FrameworkやWin32 APIが相当し、Visual Studioなどの統合開発環境を用いて開発します。プログラミングインタフェースを通じて、OSが備える数多くの機能をアプリケーションから利用するわけです。そのため、OSの機能を提供している内部構造については一通り理解しておいた方がよいでしょう。

表1●Windowsをはじめとする現在のOSが提供する主な機能
[画像のクリックで拡大表示]
表1●Windowsをはじめとする現在のOSが提供する主な機能

3層に分かれるカーネルモード

 図6にWindows 7の全体像を示します。Windowsでは、カーネルモード(図6の下側)とユーザーモード(図6の上側)という2種類の動作モードを使い分けながら、各種処理が行われます。

図6●Windows 7の全体像
図6●Windows 7の全体像
[画像のクリックで拡大表示]

 アプリケーションはすべてユーザーモードで動作し、それぞれが独自のアドレス空間や資源(ファイルやデバイスへの参照など)を保持しています。そのため、あるアプリケーションが異常な状態になったとしても、そのほかのアプリケーションやWindows 7の動作に影響が及ぶことはありません。

 一方、OSとしての基本機能が動作しているのが、カーネルモードです。このカーネルモードで動作するプログラムは、大きく三つの層に分類できます。

・HAL

 ハードウエアに最も近い層に位置するのが、ハードウエア抽象化レイヤー(Hardware Abstraction Layer、HAL)です。現在販売されているPCのほとんどがACPI(Advanced Configuration and Power Interface)というPCの電力管理などに関する規格に準拠しているため、PCごとにHALが変更されることは少なくなりました。それでも、拡張ボードなどが接続されているバスへのアクセスを抽象化するためにHALが設けられています。

・カーネル

 HALの上には、プロセスやスレッド、仮想メモリー、デバイスドライバなどを管理するカーネルが位置しています。Windows 7ではよりスケーラブルかつ堅牢なカーネルを目指して全体が見直されました。しかし、後述するシステムコールの抽象化により、従来のアプリケーションもカーネルの変更点を意識する必要はありません。

・System Service Dispatcher

 カーネルモードで動作するプログラムの最上位には、各システムコールの窓口となるSystem Service Dispatcherが置かれています。例えば、ユーザーモードで動作するアプリケーションからkernel32.dllで定義されているCreateFile()などの関数を呼び出すとしましょう。その場合は、ユーザーモード側の窓口であるntdll.dllを通して呼び出しがシステムコールに変換され、カーネルモードの窓口であるSystem Service Dispatcherが呼び出されます

 このように、システム(ハードウエアおよびその上で動くOS)の細かい部分へのアクセスが階層的に抽象化されているため、プログラマの皆さんはカーネルの細かな動作やハードウエアを意識せずに、OSの機能を利用したアプリケーションを作成できるのです。