🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fj.os.msdos
Article #123

Re: Q. Interrupt vector table

#123
From: WAKAI Hirohisa
Date: Tue, 10 Nov 1992 02:00
322 lines
17297 bytes
若井裕久@シャープ と申します。

この度の私の質問に、ニュースおよびメイルにて、
大変多くの方々から、ご教示を頂きました。
誠に有難うございました。

以下、皆様のご意見をまとめてみようと思います(遅くなって、すいません)。
誤り等がごございましたら、ご指摘の程、宜しくお願いいたします。

但し、最初の質問の趣旨としては、“ソフトウェア割り込み”についてですので、
“ハードウェア割り込み”については、省略しているところがあります。
(ハードウェア割り込みの場合は、割り込みを起こすハードウェアに、
割り込み要因レジスタなどがある場合、このレジスタを見て、
ちゃんとチェーンしてやれば、ある程度はいけそうな気がします。
多分、INT 2Fh のやり方って、これに近いんでしょうね)
また、とりあえず、今のターゲットが IBM-PC互換機+IBM-DOS/J5.0Vなので、
これを中心にまとめているところもあります。

On 10/27/92(19:27) I wrote
in <gxH6X.wakai@shpcsl.sharp.co.jp>
> “DOS”のソフトウェアで、ソフトウェア割り込みを使って、
> プログラム間のリンクをとることがよくあるようですが、
> その際、割り込み番号がぶつかってトラブルを起こすということを
> たまに聞きます。
> これは、割り込み番号を決めうちしているためかと思うのですが、
> いずれにせよ、あまり好ましいことではないような気がします。
> このようなことを回避するには、ある割り込み番号を
> 使ってもよいか否かを判断すべきだと思うのですが....


> 1) ある割り込み番号が与えられた時に、それが既に使用されているか
>    否かのチェックは可能か
に関しては、

“一般的には不可能”というご意見が多かったです。

 1-A. 割り込みベクタが「使用されていない」という状態が
      dosのoemメーカにより異なっており統一していないから

というのが、一番大きな理由のようです。
あえて一般的にやろうとした場合、少々非現実的ではあるが、

 1-B. 割り込みとして使用している場合ならcodeを追う

しかし、

 1-C. dataへのpointerとして使用している場合はどうしょうも無い

但し、機種(DOSを含む)を限定した場合や、“まず、これで大丈夫だろう”
と思われる方法はいくつかあるようです( 2)を参照)


> 2) もし可能ならば、どのような方法が有効(もしくは一般的)か
に関しては、

 2-A. メモリがクリアされた状態で残っていれば、割り込みベクタテーブルの
      中身が、0000:0000であれば未使用とする
      → 但し、98やFMRでは、未定義割り込みをトラップするルーチンが
         登録されており、0000:0000というエントリはない
 2-B. ベクタの先が、IRETコードであるのを確認する
      → IBM-PC,98でリアルモードの場合
 2-C. 割り込みベクタテーブルを全て(or 使ってよいと思われる範囲)調べ、
      a. その中で最も多く現れたアドレスを未使用と判定(2-A.参照)
      b. その中で同じ値がある数(例えば8個)以上あれば未使用と判定(2-A.参照)
         → ちょっと調べたところ、2つくらいなら使用中の場合もあるようです
 2-D. PSP を辿る
      → これは、ちょっと難しそうですね
 2-E. プロテクトモードがらみや、ソフトウェア割り込み以外の場合は、
      割り込みコントローラを見る
 2-F. CONFIG.SYSを処理し始めるときの割り込みベクタを覚えていて、これと
      比較する(WATCHVCT.SYS)
      → これならば、かなり確実なチェックができそうです

ということでした。
これらのご意見を参考にすると、2-A,B,C-b のどれかにひっかかれば、
“未使用”と判断するのがいいように思います(少々、冗長かもしれないが....)。
それに先だって、与えられた割り込み番号が、仕様で決めた範囲内か否かの
チェックは行なう方がいいでしょう。もちろん、割り込み番号は指定可能とし、
また、指定がなければ、決められた範囲内で最初に見つけた“未使用”の番号を
採用するようにするというのも親切かもしれません。
(....但し、これらは、完璧なチェックではないようなので、割り込み番号が
指定された場合は、ユーザを信じて、チェックを省略するようにする
 or エラーとせず“警告”とするのがいいのかもしれないですね....)

いずれにせよ、問題なのは、他の“割り込み番号決めつけ”のプログラムとの
共存ですが、既にインストールされているものとの競合は、上記の手法で
かなり防げそうですが、さすがに、未来についてのチェックはできないので、
DOSが割り込み番号の管理をしてくれてないという現実がある以上、
何かと問題が起こる恐れはあるということのようですね。
その場合は、DOSを補足するような、2-F のような手法がいいのかもしれません。


> 3) 割り込みベクタが、0000:0000 に特別な意味はあるのか
に関しては、“特別な意味はない”ということです。但し、

 3-A. 0000:0000では、万一、割り込みが入れば暴走するのでよくない
      → IRETか、無効割り込みトラップルーチンに飛ぶのが、
         理にかなっているし、98やFMRではそうなっている

ようですが、QEMM386のツール MFT.EXEのFirst Meg/Interrupts
(割り込みベクタテーブルの表示)では、

 3-B. 0000:0002 などは“Interrupt Area”と表示する
 3-C. 0000:0000 に対しては“None”と表示する

これからすると、0000:0000 を“割り込みの登録なし”とする“文化”が
IBM-PC/IBM-DOSなどであるのかもしれません。また、

 3-D. 割り込みベクトルをデータへのポインタにしている例
      → EMS driverなどでは、0000:0000に初期化するのが便利かも
 3-E. 割り込みベクトルにコードそのものが入っている例

などもあるようです。


> 4) 割り込み番号の割り振りは“DOS”の仕様として決まっているのか
>    また、それは公開されているのか
に関しては、OEMメーカの規定によるところであり、DOSとしは、一般には
“決まっていない”ようです。但し、

 4-A. 20hから3Fhまでは、MS-DOSが使っている/予約している
      それ以外は、BIOSが使っている/CPUが使っている/空いている 等
 4-B. メーカが提供するソフトウェアプロダクトのための予約もあるので、
      DOSの仕様だけでは決まらない
      また、一般には公開しているような本もないであろう
 4-C. IBM-PC/互換機については、comp.binaries.ibm.pcにpostされた
      “MS-DOS Interrupt list”というのがある
      → 但し、これは“実態調査結果”であり、“DOSの仕様”ではない
 4-D. 98の古い機種のマニュアルには割り込みベクタの使用状況が書いてある
      → 40h~7fh, f1h~ffhが「ユーザ用」と記されている
         → Int trap haltと表示してハングアップするルーチンになっている

また、後述のMFT.EXEの出力結果について考えると、ある程度、デファクトで
決まっていたりするような気もします。


> 5) 1)~4)について記述されている参考資料・書籍等はあるか
に関しては、たくさんあるとのことですが、具体的には、

 5-A. “MS-DOS Interrupt list”(4-A.参照)
 5-B. “Undocumented Dos:ISBN 0-201-57064-5”(日本語訳もでている)

をご紹介いただきました。


また、a),b)については、

> a) 60h~66h は各種プログラムで使ってよいらしい
については、“本当?”という意見や、“DOSの仕様である”という意見が
ありました( b)参照)。


> b) 60h~66h は 0000:0000 に初期化されている
>    → 近くにある、IBM-DOS J5.0/V, DR-DOS 6.0, MS-DOS 3.X で、
>       調べてみた結果、いずれも60h~66h は 0000:0000 であった
に関しては、QEMM386についているMFT.EXEや、ちょこちょこっと書いた
プログラム(参考までに、このプログラムを記事の最後に添付します)にて
調べた結果であります。マシンは、IBM互換機です。
上記のとおり、98/FMR等では0000:0000ではないそうです。

また、参考までに、MFT.EXEによると、
私の手元のOADG+PhoenixBIOS+IBM-DOS/J5.02Vでは、

 b-A. - 00h~3Fh: 使用されていたり、“Reserved”となっている
                  → 未使用のものは、主に、DOS内のルーチンを指しているようだ
      - 40h~5Fh: 使用されていたり、“Reserved”となっている
                  → 未使用のものは、BIOS内のルーチンを指しているようだ
      - 50h~5Fh: “Reserved”
      - 60h~66h: “Program Use”
                  → 未使用のものは、0000:0000となっているようだ
      - 67h:      “EMS Request”
      - 68h~6Fh: “Reserved”
                  → 未使用のものは、主にBIOS内のルーチンを指しているようだ
      - 70h~77h: ハードウェア割り込みが使用している
      - 78h~7Fh: “Reserved”
                  → 未使用のものは、0000:0000となっているようだ
      - 80h~85h: “Reserved for Basic”
                  → 未使用のものは、0000:0000となっているようだ
      - 86h~F0h: “Used by Basic”
                  → 未使用のものは、主に0000:0000となっているようだ
      - F1h~FFh: “Program Use”
                  → 未使用のものは、????

      → “”内の文字列は、多分、MFT.EXEが持っていると思われるので、
         Quarterdeck社では、このように見なしているのかもしれませんし、
         もしくは、これが、デファクトorIBMの標準なのかもしれません。
         実際には、もっと細かく(例えば、0Fhは“IRQ 7”とか)いろいろと
         出ていますが、これは省略しました(ファイルには落せない)。
         また、細かくはチェックしてませんが、ポストがありました、
         98用のMS_INT.DATという良く似てはいるようです。


その他として、

 e-A. INT 2Fh(多重割り込み)を使ってみる

というのもありましたが、これも、IDの割り振りの問題があるので、
“絶対”ということもなさそうな気がします。

 e-B. デバイスドライバのIOCTLを用いてリンクをとる

というのは、確かにいい方法だとは思います。LanManagerのプロトコルマネジャー
とかはそういう方法をとっていたような気がします。
....但し、ご指摘のとおり、DOSのデバイスドライバというのも、
    デバイス名に気をつけなければいけませんね。
    私も“ファイルができない”と焦ったところ、
    実はデバイス名とだぶっていたという初歩的なミスは
    経験したことがあります。
    また、ご指摘のとおり、“お手軽ではない”ことは確かですね....

 e-C. MS.EXE/COM, MS_NIT.IBMのご紹介を頂きました
      → これは、一般に出回っているものなのでしょうか?


> ASCIIの応用MS-DOSや、MS-DOSエンサイクロペディアなどを
> 斜め読みしてみたのですが、残念ながら、知りたい情報は
> 得られませんでした。
お蔭様で、かなりクリアになりました。有難うございました。
--
シャープ株式会社 技術本部 情報技術開発センター 第4開発部 若井 裕久
E-Mail wakai@shpcsl.sharp.co.jp   Nifty PDD02452

	--------------------------------------------------

b)にて書いたプログラムの添付です。

DISPINTR について:
[解凍]	uudecodeすると、dispintr.lzh ができます。
	lhaにて解凍すると、dispintr.c ができます。
[make]	Borland-C 以外でmakeできるかどうかは確かめていませんが、
	dos.h, peekb()を除いて、標準ライブラリの範囲内(の筈)なので、
	他の処理系でも、問題はないと思います。
	但し、peekb()は、peekb(segment, offset) です。一部のライブラリでは、
	peekb(offset, segment)となっているものがあるようですが、その場合は、
	適当に書き直して下さい
[起動]	アーギュメント、オプション等はありません
[機能]	各割り込み番号について、
	- ベクタ値
	- ベクタの指す数バイト(IRETで中断)
	- 同じベクタを持つ割り込み番号の表示
	- ベクタが、XXXX:YYYY のとき、XXXX:0000~1 がcdh,20hならば、
	  これをPSPと見なしてダンプする程度のことをします。
	但し、割り込みテーブルが、0000:0000~0000:03ff にあるものとしています
	(ファンクションコール経由ではなく、直接メモリを読んでいます)
[出力例]
	------------------------------------------------
00: 3ac4:01a0	b9 0e 00 ba 48 00 e9 d5 00 1e b8 00 35 cd 21 89 1e 74 00 8c 
	------------------------------------------------
01: 0070:06f4	IRET
........
	------------------------------------------------
06: f000:b948	50 2e f6 06 04 9a 20 74 07 8c c8 ea 58 b9 00 f0 55 1e 53 8b 
  Same[06]:	07 44 45 47 48 49 4a 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 68 69 6a 6b 6c 6e 6f 	count=22
	------------------------------------------------
07: f000:b948	50 2e f6 06 04 9a 20 74 07 8c c8 ea 58 b9 00 f0 55 1e 53 8b 
  Same[07]:	06 44 45 47 48 49 4a 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 68 69 6a 6b 6c 6e 6f 	count=22
........
	------------------------------------------------
09: edf8:06be	eb 08 00 41 9c 00 13 00 01 f8 55 50 53 51 52 56 57 1e 06 fc 
  PSP:		cd2069ef 009ac000 00001d04 610f4b01 	. i.........a.K.
		4d0e5601 4d0e610f 01ffffff ffffffff 	M.V.M.a.........
		ffffffff ffffffff ffffffff eaed6650 	..............fP
		f8ed1400 1800f8ed ffffffff 00000000 	................
		05000000 00000000 00000000 00000000 	................
		cd21cb00 00000000 00000000 004a5020 	.!...........JP 
		20202020 20202020 00000000 00393332 	        .....932
		20202020 20202020 00000000 00000000 	        ........
		1b204a50 2c393332 2c433a5c 444f535c 	. JP,932,C:\DOS\
		4b455942 4f415244 2e535953 0d464620 	KEYBOARD.SYS.FF 
		4b455942 2e434f4d 204a502c 3933322c 	KEYB.COM JP,932,
		433a5c44 4f535c4b 4559424f 4152442e 	C:\DOS\KEYBOARD.
		5359530d 3a5c424f 524c414e 44435c42 	SYS.:\BORLANDC\B
		494e3b43 3a5c4e57 4c495445 3b433a5c 	IN;C:\NWLITE;C:\
		5041434b 45543b43 3a5c5043 5443503b 	PACKET;C:\PCTCP;
		433a5c4c 415c4249 4e0d0000 00000000 	C:\LA\BIN.......
		e9e82300 00000000 00000000 00000000 	..#.............
		00000010 10000000 00008017 00180097 	................
........
	------------------------------------------------
62: 0000:0000	----
........
	------------------------------------------------
fe: 3485:0001	0e 83 fe 7a 7f 09 c4 5e fc 8b c6 2c 20 eb 05 c4 5e fc 8b c6 
	------------------------------------------------
ff: 0246:f000	58 c3 48 8e d8 b9 08 00 be 08 00 ac 84 c0 74 e8 3c 20 74 e4 
  Same[ff]:	ef fd 	count=02

[注意(言い訳?)] このプログラムは、割り込み番号についての一連のお話についての
	実態を調査するために作ったもので、参考までに添付するものですが、
	ご自由にお使い頂いて結構です....というほどのものでもないかぁ。
	但し、人様に使って頂くことはほとんど考えていないため、完成度は低く、
	コメントもなく、その他問題もあるかと思いますが、そこいらへんは、
	ご容赦下さい。

begin 666 dispintr.lzh
M(R,M;&@U+3D$  "U#   )U-J&2 !"D1)4U!)3E12+D-3'$T   -M:[O1-MS7
MS=$G[^KRK@#(X,DV6C<,M5+$M?!JHI)MO 1^ 8<,YP8".YNN;5_&[_N  C9'
M)75$IE5MY\MO!O!=H&C;;;W"M]?6MY8;Q32%B/+>=P"3Y(7K@*8<DL>25S,D
MBA<[C#/ 08%9)9<\AQZ".GCE&=S'"2\DV%6@>:.3NE+D@.-3F5'?Y.1D>/N'
M^198P33@_V<[7"SE8?7P1V_$T$CIH;QH')9+SL=[+(D?]?<-K>M;WV%B=ASO
M$%RF.\6.]!^'>#>C,D" -XCY8B"]WOZ^G]>?FZ_?^GYB8TWV&$##]TA 'C,>
M7.Z<?\6MX6>(Q<D1'AF@CE.*-]_#XA3$R %U#]GM]O3S]74N-;V//2D,;#_2
M5=" 0@C4RQ VSB\DUF<TS)VPSE-HO^(5]R5UR&'D<@0+G8X5 ;6#1/0)PYM8
M1T\L((B)Z$DMB!.Y#6(VL8RVSN;\D6CS;_B;XN/%AW0-OP-\6+<:<;?)Y"'W
M<=]OB9^8EGYB01GVM_)@(21>(21P+(3-L:?O8X+^),[>CJZ%Q]!I$SDHA2BV
M+0?'"W73 @N L%).5Z(RO!'\"H*$GL^:11"B&L'5<>M;#6T.0KHN+&#*JX:#
MLTB3;9&L81HK/Y@858*I6F9PL2BMK>13\"/$7#/PR^+V+/&/(?9.B&.+()8N
MB<.@Y=CSQ'2G!3&#2EC>JT0.09/AA$4*TQA&7E,7]R1OJ4#E0!W;JJ;&Q+*3
M(T #4A"=N-1@(!(<46I"YT;%2AF/14UR'[U(F/SZEOL/P?][LBMI8NE!>MAG
M3@'ZV./3@1\=A[:Y5Z:!RXKR9+]X">2@A%?&IZE+"L?Q^.TMG;6E9ZV("1$1
MRQ9R)ZZJ$PI-#S^V)N,:0^6FF-+K_@I_=T\_7_*G3&G*B-.7E91\TQ@_Q@KN
M6=A$G"?;&.UL?0QHL<I'.V;GJUMJB2([:XYSO<P?FP53MIK>!VO!Y]=*-CX9
M?4T4=RX--4C>7$TTMMJIN5KJEX$T$I6-(*JJ.(8^IS,1M#KXL"*8)[#Z7YF:
MR[=P[(740(RJUPFIH@UJZJQ"9]T'0',Q'5!2ID[=582(P^,Y&$TILL.O4J.?
M%OY%7?':JF34G"Y*0^>6)1))JJR@?[D$LQ\^>/#TQEW)LW]&%U'X"JL9(9WU
M;LP+TQD35^4XRM>@.V-&E' $<]RY7'6J;($__I*F@=9 6O.W9"6G\?IB(SX\
M*T_-H)6OHL^LD,JI.Q"H+7@HYW$%J<]R/S: A*:IS=AVZ<H.(*7%QI<)!@F&
MDRNF.*S:8GFUPB^$!82#48Y4/!X9Y@LU5JO*#0XNB<@,ZB8E_[DRW7FE97>>
M6M%[+5@7*(7]]K B0F)X%8QV]9&G(L7U\86.<2HI,YT0G4WQ[_RMD^C9IPT(
G:#S;PR6$42T]3B3K+Z-[0R][?VX.MN (&!X&@B$CF#.79^>I-48 
 
end
Technical Details
Message-ID: <g-nS-.wakai@shpcsl.sharp.co.jp>
Path: arc1-ca.pugleaf.net!sparky!uunet!stanford.edu!sun-barr!sh.wide!wnoc-kyo!shpwide!shpcsl!wakai
References: <gxH6X.wakai@shpcsl.sharp.co.jp>

Show Full Headers
Complete Article Headers
Newsgroups: fj.os.msdos
Path: arc1-ca.pugleaf.net!sparky!uunet!stanford.edu!sun-barr!sh.wide!wnoc-kyo!shpwide!shpcsl!wakai
From: wakai@shpcsl.sharp.co.jp (WAKAI Hirohisa)
Subject: Re: Q. Interrupt vector table
Content-Type: text/plain; charset=ISO-2022-JP
Message-ID: <g-nS-.wakai@shpcsl.sharp.co.jp>
Sender: news@shpcsl.sharp.co.jp
Nntp-Posting-Host: buddha
Reply-To: wakai@shpcsl.sharp.co.jp (WAKAI Hirohisa)
Organization: Info. Sys. R&D Center Dept.4, SHARP Corporation
References: <gxH6X.wakai@shpcsl.sharp.co.jp>
Mime-Version: 1.0
Distribution: fj
Date: Tue, 10 Nov 1992 02:00:43 GMT
Lines: 322