「オペレーティングシステム」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
s/アセンブラ言語/アセンブリ言語/
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎割り込み: IOポートにイミディエイトアドレスでアクセスすると下位8ビットしかアドレスバスに出ない。16ビットで指定するのはDXレジスタ間接が必要でポートアドレスのレジスタ間接にはDXしか使えない(命令のビットパターンにレジスタを選択するフィールドがない)。現在のx86のCPUではメモリーコントローラはCPUに集積されている。
タグ: 2017年版ソースエディター
108 行
キーボードや内蔵タイマなどの周辺ハードは、「割り込みコントローラ」(PIC)というものを経由して、CPUやメモリは、これらの周辺ハード(キーボードや内蔵タイマなど)を制御しています。
 
:※ 割り込みとは、何が何に割り込んでいるかというと、おおむね、CPUと内蔵DRAMメモリいま実行している命令通信と命令のあいだに、それ以外のデバイスの通信要求が割り込むイメージである。内蔵ハードディスクですら内蔵DRAMではないので、内蔵ハードディスクはその他のデバイスに含まれる。
:なので、下記の割り込みハンドラの話題に、内蔵DRAMメモリの話題が無い。内蔵DRAMは、割り込まれる側だからである。
 
ともかく、X86系における割り込みハンドラとは、イメージ的には、下図のような感じです。
{{コラム|CPUとメモリ間のバス|
 
:※ なお、CPUとメモリの間の通信方法は、CPUにアドレスピンというピンが何本かあって<ref>ダニエル・P・ボベットおよびマルコ・サセティ著『詳解Linuxカーネル 第3版』、高橋浩和監訳、2011年5月20日 初版 第5刷、40ページ </ref>、その組み合わせで、メモリにどのアドレスのデータを出力/入力するかを送受信している。
:たとえば 36本のアドレスピンのあるCPUなら、2<sup>36</sup> =2<sup>4</sup> ×2<sup>32</sup> =2<sup>4</sup> × 4GB = 64 GB(ギガバイト)までのアドレスを指定できる。
 
ここでいう、メモリとはもちろん、物理的に基盤として実在している(いわゆる)「実メモリ」、「物理メモリ」のことである。けっして仮想メモリのことではない。
 
なお、CPUのピン数とビット数とは、まったく一致しない、別の数字である。
 
たとえば、インテルの市販の昔の32ビットCPUや64ビットCPUは、ピン数が数百本はある。
 
X86系CPUにかぎらず、一般にCPUは、この節で述べるような仕組みである。パソコン用CPUにかぎらず、制御用マイコンCPUなどでも同様であり(たとえばZ80やH8など)る<ref>堀桂太郎『Z80アセンブラ入門』、東京電機大学出版局、2007年5月20日 第1版 第2刷、20ページ</ref>、「アドレスバス」や「データバス」の意味も同様である。
 
たとえば、H8マイコンは古いものは8ビット、新しいものには16ビットや32ビットもあるが、ピン数は100本ある。Z80はピン数が40本。
 
 
:そしてメモリはアドレスピンの指示どおりのデータをCPUに送信または(cpuから送られたとおりのデータを)受信するという仕組みである
アドレスピンによる設定情報が通る経路をアドレスバスという。また、アドレスピンなどの指定を受けて、メモリなどデバイスの送り出すデータが通る経路のことを「データバス」という。アドレスバスやデータバスは、(おそらく)単なる経路であり、割り込みのような機能は無いと思われる。
:このほか、タイミングの動機などの制御を行うためのコントロールバスがある。
:CPUとメモリとの間のバスは、一般的に、アドレスバス、データバス、コントロールバスの3種類だけである。
:なお、(おそらく)データバスはCPUのデータの入力/出力とも同じデータバスを兼用であると思われている。
 
:※ インテルのCPUはどうか知らないが、マイコンCPUとかだと(たとえばZ80マイコンCPUとか)、実際にアドレスバス用ピンとデータバス用ピンとが別々のピンとして割り当てられているのが、肉眼で容易に確認できる。
 
}}
 
 
ともかく、X86系における割り込みハンドラとは、イメージ的には、下図のような感じです。
<pre>
 
149 ⟶ 121行目:
(※ 以下略)
</pre>
なお、マイコンボードのPICマイコンと「割り込みハンドラ」('''PIC''')は名前が似ていますが、まったくの別物ですので、混同しないように。
 
 
なお、マイコンボードのPICマイコンとは「割り込みハンドラ」('''PIC''')は名前が似ていますが、まったくの別物ですので、混同しないように。
 
 
キーボードの制御は、PICから、さらにキーボードコントローラー(KBC)というのを経由して、通信方式は一般的にシリアル通信で、制御が行われます。
286 ⟶ 255行目:
out ポートアドレス, ax
</syntaxhighlight>
 
の書式になります。
ポートアドレスをイミディエイトウィンドウで与えた場合、IO空間の $0000 .. $FFFF のうち最下位の $0000 ... $00FF にしかアクセスできません。
 
ポートアドレスの一覧については下の表を参照。」
333 ⟶ 302行目:
 
 
ポートアドレスをレジスタに代入する場合は、慣用的に
<syntaxhighlight lang="asm">
out dx, ax
</syntaxhighlight>
のように dx レジスタ間接でIOポートを指定します(dxレジスタ以外はポートアドレスの修飾に使えません)。
のように dx をポートアドレスの指定に使うようです<ref>[http://softwaretechnique.jp/OS_Development/Tips/IA32_Instructions/OUT.html 『Tips IA32(x86)命令一覧 Oから始まる命令 OUT命令』]</ref>。
dx レジスタ間接を使うと、IO空間の $0000 .. $FFFF 全てにアクセスできます。
 
 
さらに、データサイズが何ビットかにしたがってmovやoutの末尾に b (1バイトの場合)または w (2バイトの場合)がつくので、
<syntaxhighlight lang="asm">
movb axal 、 送信したいデータ
outb ポートアドレス 、 axal
</syntaxhighlight>
のようになります。
 
なお一部のC言語のライブラリで提供されている標準外の関数 {{code|outb()}} 関数は、上述のようなアセンブリ言語のoutb命令に相当するものです<ref>ダニエル・P・ボベットおよびマルコ・サセティ著『詳解Linuxカーネル 第3版』、高橋浩和監訳、2011年5月20日 初版 第5刷、244ページ </ref>。
 
 
{{コラム|シリアル通信とパラレル通信|
なお、一般に電子機器ケーブルが信号を送受信をするとき、複数本の信号線で送信する方式をパラレル通信といい、いっぽう、1本だけの信号線で送信する方式をシリアル通信という。
 
ただし、パラレル通信は、速度が遅い。
 
一見すると、パラレル通信のほうが、線路が多いぶん多くの情報をれそうだが、実際信号の到達タイミングは、銅線どうしばらつきコンデンやアンテナとして干渉しあったりしてノイズが発したりするので、パラレル通信高速化は困難は、まり周波数を高められない
 
また、パラレル通信では微妙に線路の長さが違う影響も出て、信号の同期のタイミング調整があるので、高速化は困難である。
 
 
だとすると、CPUとメモリとの通信方式はいったい、なんなんだろうか?(インテルやAMDなどが公開していないっぽいので仕様が不明。)(ググっても、ぜんぜん出てこない。「シリアルバス」や「パラレルバス」という用語はあるが、これはマウスケーブルやらUSB端子ケーブルなどでの外部デバイスとの通信方式の用語なので、メモリCPU間の通信方式とは意味が違う。)
 
アドレスピンが30本以上もあったりすると、一見するとパラレル通信のように見える。だが、上述のようにパラレル通信には、高速化が困難という欠点がある。
 
だとすると、そのアドレスピン30本以上を使って、シリアル通信のようなデジタル波形をCPUで生成していることになるだろう。
 
だとすると、これは符号化の技術になる。
 
だとすると、ビット数が多くなるほど符号化が困難・大容量になるので、そう簡単には(パソコンCPUの)128ビット化や256ビット化が進まないのも納得である(かつてソニーとIBMは128ビットCPUのCELLを生産していたが)。
 
 
なお、Z80系マイコンCPUにはパラレル通信インターフェースの端子が存在する<ref>堀桂太郎『Z80アセンブラ入門』、東京電機大学出版局、2007年5月20日 第1版 第2刷、143ページ</ref>。Z80は最大クロック数が12MHzの製品がある<ref>堀桂太郎『Z80アセンブラ入門』、東京電機大学出版局、2007年5月20日 第1版 第2刷、134ページ(「143」の誤記ではない)</ref>。12メガもの高周波でどうやってパラレル通信をしてるか(そもそも12メガでもパラレルできるのか)、気になるところである。
410 ⟶ 365行目:
:※ 資格本などで「電気通信設備工事担任者」(いわゆる「工事担任者」)などの資格本を読むと、ここら辺の話題が説明されている。
 
さて、知り合うシリアル信号とパラレル信号の変換技術でSerDes(サーデス)という方式がある。原理は単純で、たとえばパラレル入力でA=1, B=0,C=0,D=1なら、
 
シリアル変換のために1本の送信ケーブルで1秒後に1, 2秒後に0、3秒後に0、4秒後に1を送信というように送信するようにする原理。(もちろん実際には「1秒」という長時間ではなく、もっと短い周期。)