UNIX 6th code reading - PDP11割り込みに関するまとめ

初めての方はこちらを参照 http://d.hatena.ne.jp/takahirox/20101024/1287923014

はじめに

Lions本読書会#4にてPDP11の割り込み機構が話題に上がりました。
そこで、PDP11 handbookやWikiPediaなどで調べてまとめてみました。

ハードウェアレベルの割り込み機構が理解できると、Unix v6割り込み処理もより詳細に理解できるようになると考えています。

UNIBUS

周辺デバイスからプロセッサに割り込みをかけるためには、割り込み要求や割り込み許可などデバイスとプロセッサ間で通信を行う必要があります。

そこで、まずはPDP11で採用しているUNIBUSというBusを説明します。

概要

プロセッサやコアメモリ、周辺デバイスなどは全てUNIBUSと呼ばれるBusに接続されていて、このUNIBUS経由で通信を行います。

Master/Slaveという通信形式がとられています。通信を行いたいデバイスはまずUNIBUSのBus Masterになる必要があります。Bus MasterになるとSlaveである他のデバイスと通信を行うことができるようになります。

なお、PDP11ではMemory Mapped IOを採用しており、プロセッサやOSはUNIBUSの機構を直接意識する必要はなく、メモリに対する読み書きを行うこと(メモリに対する読み書きと同じ方式)で周辺デバイスと通信が行えます。

割り込みの流れ

周辺デバイスとプロセッサはUNIBUSのBR4-7, BG4-7のうち1本を使って割り込みの要求・許可を行います。


BR4-7, BG4-7の4-7は割り込み優先度をあらわします。どの信号を使うかは各デバイスによって決まっています。


  1. 割り込みをかけたいデバイスはBus Masterになる
  2. バイスはBR4-7のうちの1つを上げる
  3. プロセッサはBRnを感知する。実行中のプロセスのプロセッサ優先度(PS[7:5])より割り込み優先度が高ければBGnを上げる
  4. BGnが上がったことを感知したデバイスは、プロセッサにInterrupt commandとVector addressを送信する
  5. プロセッサは受け取ったVector addressからPS, PCを読み込んで割り込み処理を開始します。ここから先はOSの話です。以前のエントリ参照


おそらくですが、BRn, BGnを上げるとき、誰に対して送信しているかということを見ていないと思います。

この割り込み方式の特徴は、割り込みが起きたとき「プロセッサが周辺デバイスをpollingして、どのデバイスからの要求かを確認する必要がない」点だと思います。

バイスから送られてきたVector addressによって、PCに適切な割り込み処理を行う命令のアドレスがセットされるからです。

割り込み優先度

プロセッサがBRnを感知したとき、プロセッサ優先度より低い割り込みならばBGnを返しません。これが割り込みの抑制です。

抑制された割り込みは失われることはありません。ただし、周辺デバイスはBGnが返ってくるまで割り込み要求を続ける必要があります。

つまり、抑制された割り込みは失われるのではなく、遅らされます。

参考 : http://en.wikipedia.org/wiki/PDP-11_architecture#Interrupts

Bus requests that were not granted were not lost but merely deferred. The device needing service would continue to assert its bus request.
同じ割り込み優先度を持つ周辺デバイス間の優先度

周辺デバイスdaisy chainで接続されています。


プロセッサに近いデバイスほど割り込み優先度が高くなっています。

上述の通り、各デバイスは決まったBRnで割りこみ要求を行います。そして、要求を行ったデバイスは後段へBGnを伝えません。

参考:http://en.wikipedia.org/wiki/PDP-11_architecture#Interrupts

The bus-grant lines were not common lines but were a daisy chain: The input of each gate was the output of the previous gate in the chain. A gate was on each bus device, and a device physically closer to the processor was earlier in the daisy chain. If the device had made a request, then on sensing its bus-grant input, it could conclude it was in control of the bus, and did not pass the grant signal to the next device on the bus. If the device had not made a request, it propagated its bus-grant input to its bus-grant output, giving the next closest device the chance to reply.

上記はプロセッサからの割り込み許可を示すBGnの話です。しかし、同時に起きたデバイスからの割り込み要求(BRn)をどう処理しているのかよくわかりませんでした。

BGnと同じように後段のBRnを伝えないか、もしくは、同時にBus Masterになれるデバイスは1つだけなので(?)気にしていないか、どちらかだと推測しています。


追記:@xylnaoさんよりコメントをいただきました。ありがとうございます。

BGn側でdaisy chainによる制御を行っているので、BRn側では特に意識をする必要がないようです。

割り込み優先度の管理まとめ

「割り込み優先度("BRn, BGnとPS[7:5]"&"BGnが返ってくるまでBRn要求を続ける")」と「daisy chain」により、同時に起きた割り込みの処理順序は決定されます。また、抑制された割り込みは遅らせられます。

なので、例えば「割り込みを保存するキューを使って制御する」というような方式は使っていないようです。

終わりに

PDP11の割り込み機構が知れたおかげで、Unix v6の割り込み処理部分の理解も進みました。調べる前までは「Vector Addressは誰が保持しているのだろうか?」など疑問に思っていたのですがすっきりしました。

全ての資料に目を通したわけではないので、幾分間違っている点や不足している点などあるかもしれません。そのときはご指摘ください。