IOアクセスとシングルワードDMA
2017.11.19(since2017.1.1)
サイトマップ 、トップ << 電よも < <*
IO空間とメモリ空間の物理的な識別方法わかりますか? 単純なメモリと(連続したブロックのアドレスを利用)、それ以外のリソース(一つ一つが数個からせいぜい数十個のアドレスをそれぞれ独立して使うもの。装置)に割り振るアドレスの区別です。
インテルもザイログも制御信号合計4本ですが、発想が違います。インテルさん(というかIBM-PC)の考え方で、特殊な応用が可能です。
DMA(ダイレクトメモリアクセス:CPUがお休みして、DMAコントローラがアドレスバスやRD/WR信号を支配して、プログラムから独立してデータ転送実施)という高速転送手法で、その中でももっとも古いカテゴリに、(1バイト/1ワード単位でDMA実行する)シングルワードDMAモードというのがあります。その応用がフライバイDMA(理論的には複数データを一括転送するマルチワードDMAでフライバイDMAという手法使って悪い理由はありませんが、使うの聞いたこと無いように思います。 一見効率的なんですが、実際には、メモリアクセスが遅くなるので、あまりうれしくないから使わないという事だと思います)。 まあ、遅いレートで長時間バスを占有されるとDRAMのリフレッシュ入れる暇取れないかもしれないので、マルチワードDMAでのフライバイ転送嫌われたのかな?
簡単にIO→メモリ転送の場合を例に説明すると、そもそもDMA実行時、CPUは止まっていますが、その代わりのDMAコントローラが、IOデバイスに対して、リード命令と、メモリに対するライト命令を並行してだして、IOデバイスの出力するバス上のデータを、メモリに直接書き込む手法です(逆方向も有り)。
ハンドシェークDMARQ、DMARQが、(準備しろ→転送準備できたという)タイミング調整と、IOデバイスに対するデータポートのアドレスの代行機能します(本来のアドレス信号ラインは、メモリのアドレスとしてDMAコントローラが代行出力)。 /IORDと、/MEWRが独立機能(=並列動作が破綻しない)しているので、IOデバイスのアドレスさえ用意すれば時間軸並行動作ができるというアイデアです(一般的にはCPUがIOデバイスからデータをレジスタに読んで、これを、あるメモリに書き込むという複数命令で実行するのが普通です。複数のデータをメモリに書くのには、メモリアドレスを1ワード(バイト)転送するたびに、更新する手間も必要です)。
メモリアクセスは、どんどん高速化されますが、IOデバイスはそれほどでもないので、スピード格差が大きくなり、そもそも、1ワード(バイト)毎のハンドシェークなので、そのやり取りの時間が無駄で、早くできない(結果CPUが止まる時間が長くなる)ため、互換性以外の意味はなくなったようです(とうとうATA3規格では削除されたとのこと。昔FDには利用されたと聞きますが、PC標準デバイスとしてFDが消えたのもATA3設定と同時かな?)。
この並行動作でDMARQが、IOデバイスへのアドレスの代行というそもそもの理解があれば、勘違いしないのですが、標準PCではない専用システムを作ろうとしたユーザが、ハンドシェークタイミングという意味合いでしか理解しなかったので、欲しい・準備できたと有効と主張するエッジ部分のタイミングだけ注目して、他の信号との位相を無視した運用で、データ転送がうまくいかないというクレームが来たことがあります。 過去の技術からの遷移に注目しておくと、解釈の違い(考え落ち)の危険性が下がるのに残念だなぁと思いました。海外出張中に追いかけてきたクレーム対応でした。
業務に影響するのはまずいですが、視野を広く広げて、さまざまな知識を吸収することを、お勧めします。 (2017.09.27)スペックに対して数値としてしか興味がなく、スペックの意義解ってないだろうと思う某メーカさんがいて、どこかで事故が起きたときに数字がどうのこうのとごねそうで、お付き合いしたくないとついつい態度に示してました。 受け取る側が実現できるスペックでないと、IC出口でみてうちは正しい。そちらの入り口でどうなっているかはこちらの責任ではないと言いそうな気がして嫌でした。 つまり通信の場合、出す側のスペックと受け取る側のスペックは別です(同じ数値を共有するとしても)。マルチワードDMAが高速化した時に、データ化けるというクレーム。オシロで波形を見ると、データバスの衝突と考えられる事象でした。 通常バスの制御(誰がいつバス上にデータを出力するか?)は、リード信号を出すから、その周辺機器が、データバスがハイインピーダンスになり続けるとまずいので、xx時間以内に(嘘でもいいから:嘘の場合は別途タイミング調整ハンドシェークがある)データをバスに乗せなさいというスペックがあったとします。 どうもマスター側デバイスドライバも、バスの入出力の切り替えを公開スペックに合わせて適当に実施していた節があります。 正しい解釈は、最悪0タイミング(遅くてもxx時間以内)に、バスの切り替わりが起きるから、それ以前(つまりタイミングマイナス:少なくともリード信号と同時)に、マスターさんはバスを開放(Hiz)しなさいということです。
公開スペックの数字は、立場によって、解釈を変える必要があるんだということの理解が重要です。
例えばインテルさんの8ビットや16ビットCPUは、ピン数を削減するために、バスを、アドレスとデータ時分割で使っていました。当時のインテルさん純正(の資料本)には、市販のロジックICを使って、こういう外付け回路で一般の非時分割タイプバスのICを接続する例が示されていました。スペックに対する双方の実現可能回路をちゃんと考えたうえでのスペックなら、安心ですが、自分本位な数字を並べただけに思えるスペックには不安が残ります。 自分も、あるとき、ICのピン数削減しろといわれて時分割バス化したことがありますが、こっちとCPUの、実力スペック(回路構成)考えながら、タイミングチャートを示したら、CPU担当者も何やりたいか理解できると言ってました。スペックとして、どちらもギリギリのものが残ったのですが、それぞれ相手の回路理解したうえで、バスの負荷の大小(配線長含む)とかドライバのスペック考えてお互いに破綻しないという暗黙の了解で決めたスペックをでっち上げたことがありました(規格上2信号が同時なんだけど、どっちのICから見ても、両信号には明確な前後関係が見込める。最悪時間稼ぎにコンデンサ1本つければ間違いないという見込みだったりしました)。試しに採用したスペックでしたが無事量産。セット担当者ははなから旧仕様の基板作らず新仕様版しか作らなかったらしい。 うまくいったからいいけどこういうのはよくないんだけどねぇ。
(2017.11.19)DMAつながりの雑談。昔MSDOSの時代(windows3.1かもしれない)。 PCの性能を測るツールの入ったCDROMが売られてました(普通の店ではなく寂れた片隅あたりの店がな)。記憶がはっきりしないけど、代表作はウイザードとかなんとかいう名前だったかな(三角帽の黒衣の魔術師さんが杖を振っている絵があった)。その中にツールで、CPUユーティライゼーションとかCPU占有率という項目を測定するものがあります。 端的にいうと、CDROMからあるデータを読むのに、どれくらいCPUの手間がかかるか?という測定。低いほうがCPUが他の仕事できるので優秀という指標です。DMAが機能して、転送レートがあがれば上がるほど指標は優秀と判断されます。そのため、転送速度の速いほうが有利なので、シングルワードDMA、マルチワードDMA、ウルトラDMAへと進化し、さらに、シリアルバスになって、シリアルATAという規格でまた一段と高速化しています。
で、この話題のもとはPCウイルス「保管は罪?」というネットニュースを読んで、ウイザードとか定番ではなくやや怪しめのツールを買ったらウイルスに汚染されているというのが判って、記念にそのディスク保管しておいたはず(でも行方不明)というのを、思い出しましたが、これも捕まるの??という話題でした。