このエントリーをはてなブックマークに追加

Windowsサブシステム(User、Kernel、GDI)とサンクレイヤ

対象プロダクト:Windows 95 98 Me
カテゴリー:アーキテクチャ

Windows 95 は 16bit と 32bit コードが混在する OS です。
その実現のために Microsoft は苦心しましたが、その答えが OS のコアコンポーネントを 16bit 用と 32bit 用に分け、互いをサンクさせるという方法でした。

サンクという言葉について

まず、「サンク(thunk)」という言葉は何か?について説明します。
サンクという造語は、Windows 1.0 の開発者の1人が、大学時代の研究からこの用語を流用したことから始まります。
意味としては「ある場所から別の場所に移動させるコード」という意味があります。

サンクレイヤの仕組み

Windows 95 では、メモリアドレスを 32bit (または 16bit) のフォーマットから 16bit (または 32bit) のフォーマットに変換する短い命令シーケンスをサンクと呼び、それらを実施するレイヤをサンクレイヤと呼びます。
例えば 32bit アプリケーションが Windows の User 関数を呼び出すと、Windows のカーネルはその呼び出しと 32bit のパラメータを受け取り、サンクを呼び出す。
そしてサンクはパラメータとアドレスを 16bit の等価な値に変換して 16bit の User 関数を呼び出します。

Windowsサブシステム(User、Kernel、GDI)

  • User
  • User コンポーネントは、キーボード、マウスおよび他の入力デバイスからの入力およびユーザーインターフェース(ウィンドウ、アイコン、メニューなど)への出力を管理します。
    さらに、正常なドライバ、タイマーおよびコミュニケーションポートとの対話を管理します。
    Windows 95 はシステムとアプリケーションにすべてを入力する非同期入力モデルを使用しています。
    さまざまな入力デバイスは割り込みを生成し、割り込みハンドラはこれらの割り込みをメッセージに変換し、直接入力スレッドエリアにメッセージを送信し、次に各メッセージを適切なメッセージキューへ渡します。
    Win32 ベースのスレッドは、それぞれが自身のメッセージキューを持つことができますが、Win16 ベースのアプリケーションはすべて共通のメッセージキューを共有します。
  • Kernel
  • Kernel は、ファイルI/Oサービス、仮想メモリ管理およびタスクの自動実行を含む基本的なオペレーティングシステムの機能を提供します。
    ユーザがアプリケーションを始めたい場合、Kernel はアプリケーション用の EXE と DLL のファイルをロードします。

    また、Kernel は仮想メモリを割り当て、参照のインポートを解決し、アプリケーションのためのオンデマンドページングをサポートします。
    アプリケーションが作動する際、Kernel はアプリケーションによって所有された各プロセスのスレッドをスケジュールし実行します。

    さらに、Kernel は、16bit と 32bit のフォーマット間をマップするためにサンクを使用することで、16bit および 32bit の両方のアプリケーションにサービスを提供します。
    サンクは 16bit の値を 32bit の同等の値に変換します。
  • GDI
  • GDI (Graphical Device Interface) は画面表示を管理するグラフィカルシステムです。
    さらに、プリンタおよび他の出力デバイスのグラフィックスをサポートします。
    それは基本的なグラフィックを描画し、ビットマップを操作し、ディスプレイとプリンタの出力デバイスドライバを含むデバイスインディペンデントのグラフィックスドライバと対話します。

User、Kernel、GDI の 16bit と 32bit コードの処理の違い

上述したように Windows 95 では 16bit と 32bit のコードが混在します。
Windows サブシステムである User、Kernel、GDI にはそれぞれ 16bit 版と 32bit 版が用意されています。
そして、16bit から 32bit、32bit から 16bit へと互いにコードの変換を行います。

User モジュールは殆どが 16bit コードであるため、User32 API への呼び出しは、User16 API に引き渡されます。
逆に GDI モジュールは殆どが 32bit コードであるため、GDI32 API への呼び出しは、殆どを GDI32 自身で処理します。
Kernel モジュールについては、32bit 版は完全に独立しており、Kernel16 API が Kernel32 API を呼び出す事はあっても、その逆は決してありません。

まとめると以下のとおりです。
  • User
  • 殆どが 16bit コードのままであり、殆どの 32bit API の呼び出しは 16bit API に渡される。
  • Kernel
  • 32bit 版は完全に独立している。32bit API が 16bit API を呼び出す事はない。
  • GDI
  • 殆どが 32bit コードであり、殆どの 32bit API の呼び出しは 32bit のまま処理される。

公開日時: 2011年11月25日  22:15:08

このエントリーをはてなブックマークに追加
メッセージキュー | 仮想メモリとページングファイル

Windows技術情報の一覧に戻る

「アーキテクチャ」に関する他の技術情報
技術情報のカテゴリ

このページのトップに戻る