さまざまな OS のファンクションコール方法
(1999/11/05 [金])
以前 Windows NT の場合のファンクションコール方法を示しましたが、UNIX についての情報も入ったのでまたまとめてみましょう。
Windows 9x のアプリケーションは通常 ring3 で動作しています。しかし例えば、kernel32 などにある機能を呼んだ場合、自分で処理する代わりに VxD レイヤーにある機能を呼びます。その時に int 30h を使ってリングレベルを変更するのです。
VxD は CD20FFFFNNNN のような機械語形態でファンクションが形成されます。FFFF はファンクション番号、NNNN は呼び出す対象となる VxD の識別番号です。プログラムの実行がこの部分に差しかかると CD20、つまり int 20h の割り込みがかかります。すると、VxD レイヤーでこれを FFFFNNNN で示されるファンクションのエントリアドレスを見つけ出し、そこを呼び出す near call 命令でこの部分すべてを置き換えます。したがって、その時に呼び出すことの無かった部分は fixup の必要が無く、また使用する部分だけを fixup するので効率的に動作できます。
OS | 呼び出し 形式 | 説明 |
---|---|---|
DOS | int 21h | 典型的には ax, ah にファンクション番号。パラメータはレジスタ。 |
Windows VxD | int 20h | int 20h, dw ファンクション番号, dw VxDの識別番号 |
Windows 9x AP | int 30h | Ring3 から Ring0 (VxD レイヤー) に移行 |
Windows NT | int 2eh | eax にファンクション番号 |
FreeBSD | int 80h | eax にファンクション番号。パラメータはスタック。 |
Linux | int 80h | eax にファンクション番号。パラメータはレジスタ。 |
Windows 9x のアプリケーションは通常 ring3 で動作しています。しかし例えば、kernel32 などにある機能を呼んだ場合、自分で処理する代わりに VxD レイヤーにある機能を呼びます。その時に int 30h を使ってリングレベルを変更するのです。
VxD は CD20FFFFNNNN のような機械語形態でファンクションが形成されます。FFFF はファンクション番号、NNNN は呼び出す対象となる VxD の識別番号です。プログラムの実行がこの部分に差しかかると CD20、つまり int 20h の割り込みがかかります。すると、VxD レイヤーでこれを FFFFNNNN で示されるファンクションのエントリアドレスを見つけ出し、そこを呼び出す near call 命令でこの部分すべてを置き換えます。したがって、その時に呼び出すことの無かった部分は fixup の必要が無く、また使用する部分だけを fixup するので効率的に動作できます。
by seclan