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

削除された内容 追加された内容
M source
M いろいろ整備
277 行
なお、ポートアドレスで指定したIOポートにデータを送信できます<ref> 白崎博生『新装改訂版 Linuxのブートプロセスをみる』、株式会社 KADOKAWA、2014年10月2日 初版発行、55ページおよび66~67ページ</ref>。
 
<syntaxhighlight lang="asm">
out 0x21, ax
</syntaxhighlight>
のように書きます。
 
つまり、
<syntaxhighlight lang="asm">
out ポートアドレス, ax
</syntaxhighlight>
 
の書式になります。
 
要するに、「0x21」とは下記の意味のポートアドレスですの一覧については下の表を参照
 
{| class="wikitable"
322 ⟶ 326行目:
 
つまり、
<syntaxhighlight lang="asm">
mov mov ax, 送信したいデータ
out ポートアドレス, ax
 
</syntaxhighlight>
の書式になります
 
 
ポートアドレスをレジスタに代入する場合は、慣用的に
<syntaxhighlight lang="asm">
out dx, ax
のように dx をポートアドレスの指定に使うようです[http://softwaretechnique.jp/OS_Development/Tips/IA32_Instructions/OUT.html 『Tips IA32(x86)命令一覧 Oから始まる命令 OUT命令』]。
</syntaxhighlight>
のように dx をポートアドレスの指定に使うようです<ref>[http://softwaretechnique.jp/OS_Development/Tips/IA32_Instructions/OUT.html 『Tips IA32(x86)命令一覧 Oから始まる命令 OUT命令』]</ref>
 
 
さらに、データサイズが何ビットかにしたがってmovやoutの末尾に b (1バイトの場合)または w (2バイトの場合)がつくので、
<syntaxhighlight lang="asm">
movb ax 、 送信したいデータ
outb ポートアドレス 、 ax
</syntaxhighlight>
のようになります。
 
なおC言語の {{code|outb()}} 関数は、上述のようなアセンブリ言語のoutb命令に相当するものです<ref>ダニエル・P・ボベットおよびマルコ・サセティ著『詳解Linuxカーネル 第3版』、高橋浩和監訳、2011年5月20日 初版 第5刷、244ページ </ref>。
 
 
370 ⟶ 379行目:
よく変換コネクタで、シリアル通信とパラレル通信の変換コネクタなどが業者むけに販売されているが(はたして家電量販店で市販してるかどうかは知らない)、これは、符号を別方式の符号に変換してるのである。けっしてアナログ信号をデジタル信号に変換してるわけではない(つまり、ADコンバーター(アナログ/デジタル変換器のこと)とは違う。)。
 
なお現代でも、産業用機械などにおいて(装置と別の装置との)送受信の場合などは、(USBシリアル接続でなくて)パラレル通信用の端子ケーブル(たとえば RS 232CRS232C ケーブルなど )が使われる。
 
なお、RS232Cケーブル(これはパラレル端子)やPS/2ケーブル(これはシリアル通信端子)は、イメージ的に何となく古いイメージなので、てっきりアナログ通信かと誤解しがちだが、RS232CケーブルとPS/2ケーブルはそれぞれデジタル通信である。
400 ⟶ 409行目:
 
:※ 資格本などで「電気通信設備工事担任者」(いわゆる「工事担任者」)などの資格本を読むと、ここら辺の話題が説明されている。
 
:※ いっぽう、大学の教科書がウンコ・糞で、大学の『伝送回路』とか『デジタル回路』とか『信号処理』とかの本を読んでも、ぜんぜん関係の無いフーリエ変換の公式の紹介とかZ変換などの類フーリエ変換とか、あるいはそれらフーリエ解析の公式を使って計算練習で取ってつけたような計算問題ばかりしてる教科書とか(実務で使い道の無い計算)、アナログ回路のテブナンの定理とかの話題を抱き合わせたりとか、きわめてウンコ教材である。
 
さて、知り合う信号とパラレル信号の変換技術でSerDes(サーデス)という方式がある。原理は単純で、たとえばパラレル入力でA=1, B=0,C=0,D=1なら、
409 ⟶ 416行目:
簡単にいうと、このserdesの原理では、入力ピン数が増えると、そのぶん周期が長くなる。
 
8B/10B などの符号化と、このserdesを組み合わせて、 8B/10B SerDes などとして、コンピュータ内部では使われている。
 
 
463 ⟶ 470行目:
用語だけ見ると、てっきり、1文字ぶん短いマルチプレクサのほうが(デマルチプレクサよりも)中枢的な部品のように思えるが、しかし実際はデマルチプレクサこそが中枢的であり、デマルチプレクサによる回線切り替えこそが重要技術である。
 
[[File:OR-gate of diodes.svg|thumb|230px|left|ダイオードによるOR回路の等価回路の概略図<br>※ ただし現際にはパソコン内のOR回路はMOSトランジスタなどによる回路であり、ダイオードではない。]]
 
さらにいうなら、そのOR回路自体、内容単に、逆流防止をしするためにつけられただけである。このように、マルチプレクサでの出力端子のOR回路に、あまり深遠な意味は無い。
 
 
479 ⟶ 486行目:
 
 
デジタル電子回路でよく、2進-10進デコーダという、4本の入力端子の2進数の入力を、出力10本の回路に切り替える回路がある。(2の4乗は16なので、さいだい最大16本の出力に切り替えできる。)
 
さて、パタヘネ本によると、X86系CPUの命令数は約1000個らしい<ref> David A. Ratterson, John L.Hennessy『コンピュータの論理と設計 第5版[上] ~コンピュータのハードウェアとインターフェース~』、2019年9月5日 第5版 第7刷 発行、157ページの図2.43など</ref>。なので、CPU用のデマルチプレクサを作りたい私たちは、単に2進-1000進デコーダを作ればいいだけであろう。パタヘネ本によるとX86系の命令数は2012年の時点で900個である。
490 ⟶ 497行目:
さて、私たちに必要なスイッチ個数はアセンブラの命令によって切り替えるので、最低でも数百個もの切り替えが必要だろうが(ひょっとしたら数千個や数万個)、
 
ここで2の16乗は65536なので、たった16ビットぶんのデマルチプレクサの配線をするだけで(ただし、導線の本数も数万本になるだろうが)、回路を切り替えられる。
ここで指数関数の特性に注目しよう。
 
2の16乗は65536なので、たった16ビットぶんのデマルチプレクサの配線をするだけで(ただし、導線の本数も数万本になるだろうが)、回路を切り替えられる。
 
数万本もの導線というと、人間の手作業ではムリだが、しかし半導体リソグラフィーを使えば可能であろう。というか、たとい困難だろうが、それをやった企業が半導体チップ産業の覇者になっているのだろう。
 
半導体の製造では紫外線照射や近年の研究開発ではX線照射をするらしいが、回路の焼付けのための(紫外線などの)照射の回数を、私たちの目標ではなんとか16回~32回ていど程度に抑えたいものである(さすがに65535回や4294967296回(2の32乗)も紫外線照射する方式は、生産性が悪いだろうし、作業員への放射線被爆による発ガンなどの健康被害がひどそうだ
 
 
では、何にしたがって回路を切り替えるかというと、(上述したように)アセンブラのプログラムにしたがって回路を切り替えればいいのである。そのため、アセンブリ言語は、スイッチ切り替えに対応可能なような命令体系になってなけれればらない
 
 
また、アセンブリ言語は、スイッチ切り替えに対応可能なような命令体系になってなけれればらない。
 
 
さて、そのアセンブラのプログラムの読み取りのためには、いわゆるプログラムカウンタも作る必要がある。
 
 
さて、そのアセンブラのプログラムの読み取りのためには、いわゆる現在の命令の位置を示す「プログラムカウンタも作る必要がある。
では、そのプログラムカウンタをどうやって作ればいいか?
 
ヒントは、昔の紙テープ式コンピュータで、要するにあれと同じことを電子データで実現すればいいのである。
 
 
まず、紙テープコンピュータがどういう仕組みになってる考えよう。
 
 
紙テープのうち、一定の読み取り面だけを読み取るわけで、その紙テープにデータに対応する穴が開いていて、その穴の位置や大きさなどの組み合わせで、プログラムデータを区別しているわけである。
 
そして、紙テープ読み取りコンピュータがプログラムデータを読み取り終わって、そのプログラムを実行し終えたら、テープを一定幅だけめるわけである。
 
そして、また、テープを読み取り、プログラムを実行することの繰り返し。
525 ⟶ 524行目:
 
 
まず、プログラム実行時のデータ保存領域が必要だが、これはメモリ代用すればいい。というか、そもそも、そういう目的メモリやハードディスクなどが作られことになったハズだ
 
ハードディスクは低速なので、ハードディスクからメモリに読み出す仕組みになっている。
 
 
現代のパソコンでは、狭義の命令プログラム保管用のDRAMメモリと、プログラム以外の画像データや音声データやテキストデータなどのDRAMメモリは、同じメモリ基盤上にある。だが原理的には、必ずしも同じ基板上にする必要は無く、そういう構造の場合をハーバード・アーキテクチャという。つまり、命令用メモリと、データメモリとが別々の部品であるのが、ハーバード・アーキテクチャである<ref name="H8">『H8マイコン入門』、堀桂太郎、東京電機大学出版局、2003年12月20日 第1版 第2刷、6ページ</ref>。かつてハーバード・マークワンで採用されていたアーキテクチャが、そういう(命令とその他データの分離された)アーキテクチャだった)。1990年以降でもAtmel社のAVRシリーズの8bitマイコン用CPUが、ハーバード・アーキテクチャを採用している。Arduino という2005年以降に普及たイタリアのマイコンボードで8bit用ボードにAVRシリーズを採用している。ハーバード型(ハーバード・アーキテクチャ)は欠点として回路構造が複雑になるものの、長所として高速化しやすいという利点もある<ref>『 name="H8マイコン入門』、堀桂太郎、東京電機大学出版局、2003年12月20日" 第1版 第2刷、6ページ</ref>。そのため、一部の制御用マイコンでもハーバード型が活用されているという<ref>『 name="H8マイコン入門』、堀桂太郎、東京電機大学出版局、2003年12月20日" 第1版 第2刷、6ページ</ref>>。
 
 
さて、演算回路などでプログラムの実行が終わったら、なんらかのフィードバックをプログラムカウンタに返して、前に送ったプログラムが終了したことをカウンタに知らせる必要がある。つまり、どんなプログラム命令でも、命令1個につき、かならず終了後に、命令実行を確認するためのフィードバックを返す必要がある(ただし、デジタルのフィードバック信号)。命令実行ずみ検出フィードバックが帰ってくるまで、プログラムカウンタを進めない仕組みにする必要がある。
 
電子回路の本を読めばフードバックなんて、どこの本でも書いてある。
 
演算回路の出力に、フィードバック回路もつければいいだろう。
542 ⟶ 540行目:
あとは、プログラムをそもそもどうやって入力するかだが、コレは単にキーボードから入力すればいい。キーボードは、人間が手作業でボタンを押して入力するので、単に、そのボタンの押された内容にもとづいて、メモリに機械語を保存すればいい。
 
メモリそのものは、SRAMのようにフリップフロップ回路で作だろうことができる
 
電源を切った後にも保存したければ、磁気テープならぬ磁気ハードディスクにでも保存しとけばいい。黎明期のコンピュータだって、紙テープに保存していたわけだ。
569 ⟶ 567行目:
{{x86-inst-2|out}}
 
実例として一般に、キーボードコントローラーのポートアドレスは 0x60 と 0x64 である。0x60がデータ用、0x64がコマンドやステータス用です<ref name="making_os:447"> (※ 参考文献『作って理解するOS』、初版第1刷、447ページ ) </ref>。
なので
out 0x60, al
のような命令により、読み書きが可能である<ref name="making_os:448"> (※ 参考文献『作って理解するOS』、初版第1刷、448ページ ) </ref>。
 
 
802 ⟶ 800行目:
また、
:ブートローダと認識させるために必要な署名は、512バイト目の最後の2バイトに16進数で「aa55」と書き込まなければならない(※ 511バイト目が「aa」、512バイト目に「55」である)、
と決まっています
 
 
1,408 ⟶ 1,406行目:
:[http://jou4.hateblo.jp/entry/2012/12/15/120611 INT 13h - jou4のブログ]
 
{{code|int 13h}}ともいうので、それググる。
 
;参考文献