このページの本文へ

前へ 1 2 3 4 次へ

基礎から覚える 最新OSのアーキテクチャー 第13回

ARM版Windows 8実現の布石となったWindows 7の「MinWin」

2012年03月29日 12時00分更新

文● 塩田紳二

  • この記事をはてなブックマークに追加
  • 本文印刷

DLLの中身はほとんど
アプリケーションのEXEファイルと同じ

 WindowsがAPIを提供する基本的な仕組みは、「DLL」(ダイナミックリンクライブラリ)にある。そしてDLLは、複数のプロセスから共有できるプログラムモジュールになっている。DLLの中に入っているのは、通常の実行ファイル(EXEファイル)などと同じプログラムコードだが、複数の機能(関数)を外部に提供できるような構造になっている。

 前回簡単に説明したように、DLLは複数のプロセスから呼び出されるが、メモリー中にはひとつしか存在しない。1度物理メモリーに割り当てられたら、これを各プロセスの仮想メモリー空間に割り当てるようになっている(詳細は前回のこちらを参照のこと)。

 ただし、複数のプロセスから同時に呼び出されても、お互いに影響しないように書き換え可能なデータは、呼び出し側のプロセスのメモリー空間に別途確保される。具体的には、呼び出し側プロセスで使っているスタックをそのまま利用するなどして、必要なメモリーなどを確保する。

 ファイルの拡張子こそ違うが、DLLの基本的なファイルフォーマットは、EXEファイルとほとんど同じである。DLLといっても、中に入っている機械語コードは同じようなものだ。もちろん、いくつか違う点もある。わかりやすい違いは、DLLはEXEファイルと違って、エクスプローラーなどから直接起動できないことだ。また、DLLは内部に、外部から呼び出す関数などの情報である「エクスポートセクション」を持っている。

 DLLの内部には、独立した複数のプログラムを格納することができる。多くの場合そのプログラムは、呼び出し側に対してなんらかの値を返すため、これを「関数」と呼ぶ。これに対して、値を返さないプログラムを「手続き」と呼んで区別することがある。関数はそれぞれ独立したプログラムであり、DLL外のプログラムからこれを呼び出して利用する。またDLL内には、DLL自体の初期化を行なうプログラムがあり、メモリーにロードされたり、新しいプロセスから呼び出される場合などに実行される。

 ちなみに、マイクロソフトの開発ツール「Visual Studio」でDLLを作成すると、同時にアプリケーション側で参照するための「.LIB」ファイルが作成される。ここには、DLL内で定義されている関数の情報が入っており、アプリケーション作成時にこれを使って、関数とDLL名などの関係を埋め込む。

DLL内の関数を、
Windowsはどうやって見つけるのか?

 DLL内部には、外部からDLL内の関数を呼び出すための情報がある。すべての関数には「序数」(Ordinal Number)と呼ばれる番号が振られており、DLLのファイル名とこの序数があれば、Windowsが関数の呼び出しを仲介してくれる。また、DLLを開発する際には関数に名前を付けておけるので、DLL名と関数の名前でも関数を呼び出すことが可能だ。

 この仕組みを可能にしているのが、DLL内にあるエクスポートセクションだ(図1)。ここには、大きく5つの表(テーブル)がある。

図1 エクスポートセクションの仕組み。DLLはほかのプログラムから内部の関数を呼び出すための情報として、「エクスポートセクション」を持つ。ここには、DLLで定義している関数の名前や番号、ファイル内での位置などの情報が格納されている

 最初にあるのは「Export Directory Table」で、これはエクスポートのための情報や、後続する4つのテーブルの位置などを格納している。次の「Export Address Table」は、DLL内にある各関数の開始アドレスを格納している。開始アドレスの並びが「序数」になっているので、序数がわかればこのテーブルを使って、各関数の開始アドレスがわかる仕組みだ。

前へ 1 2 3 4 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン