이신플러스의 달콤쌉싸름한 낙원

반응형

CPUが外部とデータをやり取りするための装置をI/Oと呼びます。データをやりとりす るため、一時的にデータを蓄えておくレジスタを持っています。これをバッファと呼ぶ 場合があります。I/Oは繋ぐ対象によって動作が様々なので授業で扱うのが難しい です。しかし、どのI/Oも ①まずCPUと接続しなければならず、②外部とデータ転送を行わなければならない です。なので、この2点について押さえておこうと思います。後はあなたの扱うI/O 毎に個別の勉強するしかないです。

CPU가 외부와 데이터를 교환하기 위한 장치를 I/O라고 부릅니다. 데이터를 교환기 때문에, 일시적으로 데이터를 모아 두고 레지스터를 가지고 있습니다.이를 버퍼라고 부르는 경우가 있습니다. I/O 연결 대상으로 동작이 다양한 거라 수업에서 다루기가 어렵습니다. 그러나 어느 I/O  우선 CPU와 접속해야 하며  외부와 데이터 전송을 해야 합니다. 그래서  2점 누르고 두려고요.다음은 당신 취급 I/O마다 개별 공부할 수밖에 없습니다.



まずCPUからI/Oを扱う方法としてメモリマップトI/OとプログラムドI/Oがあります。 メモリマップトI/Oでは、データメモリと同じアドレス空間にI/Oのレジスタを割り当 て、メモリを読み書きするのと同じLD,ST命令を使ってレジスタを読み書きします。ど んなCPUにでも接続でき、I/Oのために特殊な命令やバスを設ける必要がないと いう利点がある一方、I/Oのレジスタの領域は比較的小さいので、使われない領域 が無駄になりやすい点が問題です。

우선 CPU에서 I/O을 다루는 방법으로 메모리  I/O와 프로그램 I/O 있습니다. 메모리  I/O에서는 데이터 메모리와 같은 주소 공간 I/O레지스터 할리당 메모리를 읽는 것과 같은 LD, ST명령으로 레지스터를 읽고 씁니다.무척 사람이 CPU 연결되고 I/O때문에 특수한 명령이나 버스를 마련할 필요가 없는 이점이 있는 반면 I/O레지스터 영역은 비교적 작으므로 사용되지 않는 영역이 헛되게 되기 쉬운 점이 문제입니다.


これに対してプログラムドI/Oは、IN命令、OUT命令など専用の命令でI/Oに読 み書きをします。IN 0, OUT 1などI/O番号を指定しますが、これはすなわちメモリか ら独立したアドレス(番地)空間を持っているということに他ならないです。この方式 は、バスもメモリと独立しているIsolate I/Oとバスは共通で番地空間だけ分ける Separate I/Oを分けて考える人も居ますが、あまりこだわらない人も居ます。そもそも プログラムドI/Oという名前もさほど一般的ではありません(でも正式にはこう言うら しいです)。この方法は、独立した番号の空間があるので、メモリ領域を無駄遣いし ない利点がありますが、専用命令が必要です。ちなみにバスが独立しているものは、 メモリのアクセスとI/Oのアクセスを同時に行なうことができます。

이에 대해서 프로그램 I/O IN명령, OUT명령  전용 명령으로 I/O 읽어 면 쓰기를 합니다. IN 0, OUT 1 I/O번호를 지정합니다만, 이는  메모리인가  독립한 주소(번지)공간을 갖고 있다는 것과 다름없습니다. 이 방식은 버스나 메모리와 독립된 Isolate I/O와 버스는 공통으로 번지 공간만 나눠Separate I/O 나누어 생각하는 사람 지만, 그다지 연연하지 않는 사람있습니다. 원래 프로그램 I/O라는 이름 그다지 일반적이지 않아요( 그래도정식 이렇게 말하 좋겠습니다).  방법은 독립된 번호 공간이 있으므로메모리 영역을 낭비하지 않을 이점이 있지만 전용 명령이 필요합니다.그리고버스가 독립하고 있는 것은, 메모리의 접근 및 I/O 접근을 동시에 할 수 있습니다.

両者の特徴をまとめてみましょう。どのようなCPUでも使えるメモリマップトI/Oが最 近は標準的に使われます。個別的なバスは標準バスに対応できないためです。こ のためIntel 86系のCPUはプログラムドI/O用の命令を持っていても実際にはメモリ マップトI/Oで動いている場合がほとんどです。プログラムドI/Oは主として信号処 理用プロセッサDSPや制御用のマイクロコントローラで用いられ、複数のバスを 使ってI/O間で高速なデータ転送を行えるものもあります
양자의 특징을 정리하 봅시다. 어떤 CPU에서도 쓸 메모리  I/O가 최고치는 표준적으로 쓰입니다. 개별적인 버스는 표준 버스에 대응 할 수 없기 때문입니다.  때문에 Intel 86계열 CPU 프로그램 I/O용 명령을 가지고 있어도실제로는 메모리  I/O에서 움직이고 있는 경우가 대부분입니다.프로그램I/O 주로 신호처 이치용 프로세서 DSP및 제어용 마이크로 콘트롤러에서 이용되며, 복수 버스를 이용하 I/O 고속 데이터 전송을 할 도 있습니다


I/Oデバイスは、データレジスタ、コントロールレジスタ、ステータスレジスタの三種 類のレジスタを持っています。データレジスタはCPUが読み書きする場合、一時的 にデータを保存しておく場所です。入力用のデータレジスタと出力用のデータレジス タは同じ番地に割り当てられており、書き込むと出力され、読み出すと入力される場 合もあります。ステータスレジスタは、I/Oの状態を覚えておく場所で、データが到 着したり、データを送り終わったりしたことを示す情報を持っています。基本的には 読み出し専用です。コントロールレジスタはI/Oに対する指示を記憶する場所です。 Ethernetコントローラなどの動作が複雑なI/Oでは、多数のコマンドレジスタを持っ ています。基本的には書き込み専用です。このため、ステータスレジスタと同じ番地 を割り当て、読むとステータスレジスタ、書くとコマンドレジスタとして使われる場合も あります。

I/O디바이스는 데이터 레지스터, 컨트롤 레지스터, 스테이터스 레지스터 세가지 종류 레지스터를 가지고 있습니다. 데이터 레지스터는 CPU 읽는 경우 일시적으로 데이터를 보존하는 장소입니다. 입력용 데이터 레지스터와 출력용 데이터 소스 디스 타는 같은 번지 배정 받았고 쓰면 출력되며 읽어 내면 입력되는 장 아이도 있습니다. 상태 레지스터 I/O상태를 기억하 장소에서 데이터가 해당 입히거나 데이터를 보내 끝나거나 한 것을 나타내는 정보를 가지고 있습니다. 기본적으로는 읽기 전용입니다. 컨트롤 레지스터는 I/O에 대한 지시를 기억하는 장소입니다. Ethernet컨트롤러 등 동작이 복잡한 I/O에서는 다수의 명령어 레지스터를 가지고 있습니다. 기본적으로는  전용입니다.이 때문에상태 레지스터와 같은 주소를 할당, 읽으면 상태 레지스터, 쓰면 명령 레지스터 사용되는 경우도 있습니다.



古典的なI/OとしてUART 8251を紹介しましょう。このI/Oは、パラレル/シリアル 変換用で、CPUからのデータを直列に、すなわち時間的に順番に出力し、直列に入 力されたデータをCPUの並列データとして受け取ります。5bit-8bit単位のデータを 10Mbps(bit per second)という遅い転送レートで送ります。昔、データを音に変換して 電話で交信するモデムという装置が使われたときの規格であるRS232C用に作られ ました。RS232Cは、モデムがなくなった後も簡単な端末用のインタフェースとして 使われ、今でもその簡便さから遅くも良いインタフェースとして用いられます。8251 は今でもFPGA内でIP(Intellectual Property: 出来合いの回路)として使われます

고전적인 I/O UART 8251을 소개합니다.  I/O 평행/시리얼 변환용으로CPU 데이터를 직렬로, 즉 시간적으로 차례로 출력하고 직렬로 고 힘 된 데이터를 CPU 병렬 데이터 받습니다. 5bit-8bit단위의 데이터를 10Mbps(bitper second)라는 느린 전송 속도에서 보냅니다. 예전에 데이터를 소리로 변환하고 전화로 교신하는 모뎀이라는 장치가 사용됬을 때 규격인 RS232C용으로만들어졌습니다. RS232C는 모뎀 없어진 뒤에도 간단한 단말기용 인터페이스로 사용됐고 지금도  편이성에서 늦어도 좋은 인터페이스로 사용됩니다.8251은 지금 FPGA내에서 IP(Intellectual Property:이미 만들어진 회로)로 쓰입니다


シリアル転送はまずStart bitとして一定の時間0を送ります。次に順に5ビットから8 ビットのデータを転送し、最後にパリティを送った後にストップビットを一定の時間1に して送ります。パリティは偶数パリティ、奇数パリティを選択可能で、ストップビットも 長さを選択可能です。

시리얼 전송은 우선 Start bit으로 일정 시간 0을 보냅니다. 다음에 차례로 5비트에서 8비트 데이터를 전송하고 마지막으로 패리티 보낸 후 정지 비트를 일정 시간 1 보냅니다.패리티 짝수 패리티 홀수 패리티 선택 가능하고 정지 비트도 길이를 선택 가능합니다.

この8251のコントロールレジスタとステータスレジスタを紹介します。コントロールレ ジスタは、パリティの選択、データ長の選択を行ないます。パリティ(Parity)とは、1 ビットの誤り検出符号で、データ内の1の個数を偶数または奇数にそろえることによ り、1ビットエラーの検出を行ないます。偶数パリティを例に取って説明します。デー タ内の1の個数が偶数ならばParity bitを0とし、奇数ならばParity bitを1とします。 Parity bitを含めた全体のデータの1の個数は常に1になるので、1の数が奇数のデー タを受け取ったら誤りがあったことに気づくことができます。8251ではPEN=1でパリ ティを使う設定にし、EP=1ならば偶数パリティ、0ならば奇数パリティに設定できます。 ステータスレジスタは、フラグを含みます。ここでは0ビット目がTxRDYでここが1なら ば、送信用のバッファが空いていて書き込み可能であることを示します。1bit目は RxRDYでここが1ならば、受信が終わって、受信バッファ内に有効なデータがあること を示します。これらはハンドシェイクに使います。
 8251 컨트롤 레지스터 스테이터스 레지스터를 소개합니다. 컨트롤별 지수 타는, 패리티의 선택, 데이터 길이 선택을 실시합니다. 반전(Parity) 1비트 오류 검출 부호에서 데이터  1 개수를 짝수 또는 홀수에 갖추. 총리, 1비트 오류 검출을 실시합니다. 짝수 패리티를 예 설명합니다. 데이   1개수가 짝수이면 Parity bit 0으로 홀수라면 Parity bit 1로 합니다. Parity bit 포함한 전체 데이터 1 개수는 항상 1이 되므로 1수가 홀수 주간 정보를받아들이면 오류가 있었다는 것을 알아챌 수 있습니다. 8251에서는 PEN=1에서 파리  사용하는 설정으로 EP=1이면 짝수 패리티, 0이면 홀수 패리티설정할 수 있습니다. 상태 레지스터 플래그를 포함합니다. 여기서는 0비트째 TxRDY에서 여기가 1이면, 송신용 버퍼가 비어 있고 쓸 수인 것을 나타냅니다. 1bit RxRDY에서 여기가 1다면 수신이 끝나고 수신 버퍼 안에 유효한 데이터가 있음을 나타냅니다.이들은 핸드 쉐이크에 사용합니다.

ハンドシェイクとは、送信側と受信側が同期を取って取りこぼしなくデータを転送する のに使われる方法です。送信を例に取って示しましょう。CPUがステータスレジスタを 読んで、TxRDYが1ならば、バッファが空いているので、ここにデータを書き込みます。 すると、TxRDYが0になります(正確にはダブルバッファなので動きが多少違うのです が、)。TxRDYのようにバッファの状態を示す1ビットの情報をフラグ(旗)と呼びます。 分岐命令の条件を示すフラグと機能は同じです

드 쉐이크 송신 측과 수신 측이 동기를 취하고 예상 밖의 잘못이 없는 데이터를 전송하는데 사용되는 방법입니다. 송신을  나타냅시다. CPU 상태 레지스터를 읽고 TxRDY 1이라면, 버퍼가 비어 있어, 여기 데이터를 씁니다. 그러면 TxRDY 0이 됩니다(정확히는 더블 버퍼이라 움직임이 다소 다릅니다만,).TxRDY처럼 완충 상태를 나타내는 1비트의 정보를 플래그(깃발)라고 부릅니다. 분기 명령 조건을 제시하는 플래그 기능은 같습니다



CPUはTxRDY=0の時は、バッファ内のデータはまだ転送が終わっていないので、待ち 状態になります。外部にあるモデム装置(あるいは端末)は、TXRDY=0でデータが書 き込まれたことが分かり、受信状態になりシリアルにデータが転送されます。

CPU TxRDY=0때는 버퍼  데이터는 아직 전달이 끝나지 않았으니 기다리는 상태가 됩니다.외부에 있는 모뎀 장치(혹은 단말기)는 TXRDY=0에서 데이터가  할 수 있다, 수신 상태가 되는 시리얼과 데이터가 전송됩니다.

データの転送が終わると、TxRDY=1になります。CPUはこれを検出して次のデータを 書き込みます。このようにして書き潰しを起こすことなく、データを転送することがで きます。このような同期操作をフラグを使ったハンドシェイク(握手)と呼びます。
데이터 전송이 끝나 TxRDY=1이 됩니다. CPU 이를 검출하고 다음 데이터를 씁니다. 이렇게 서키궤시 일으키지 않고 데이터를 전송하는 것 옵니다.이런 동기 조작을 플래그를 사용한 핸드 쉐이크(악수)라고 부릅니다.


受信の時はこの逆になります。外部のモデム装置はRxRDYが0であることを確認して バッファにデータを書き込みます。CPUはRxRDYが1になると、データが受信されたこ とが分かるので、バッファからデータを読み出します。この操作でフラグは0になりま すので、モデム装置は次のデータを書き込みます。

수신할 때  거꾸로 됩니다. 외부 모뎀 장치는 RxRDY 0임을 확인하고 버퍼에 데이터를 씁니다. CPU RxRDY 1이면 데이터가 수신 아이 알고, 버퍼에서 데이터를 읽어 냅니다.이 조작으로 플래그는 0이 되  모뎀 장치는 다음 데이터를 씁니다.



フラグを使うことで、読み出し、書き込み間の障害(ハザード)を防ぐことができます。 一般的にハザードは3種類あります。Read After Write(RAW)ハザードは、ちゃんと値 を書き込まれるのを待って読み出すことで、これがおきると同じデータを間違って複 数回読んでしまう問題が起きます。一方、Write After Read (WAR)ハザードは、読む 前に書いてしまう問題で、これは書き潰しを起こしてデータが消失してしまう問題で す。Write After Write (WAW)ハザードは書き込む順番が狂う問題で、単純な入出力 では考えなくてもいいです。これらのハザードは、パイプライン処理でも起こるので その際にまた解説します。

플래그를 사용하면서 읽어 내고 글  장애(해저드)를 막을 수 있습니다. 일반적으로 해이는 3종류가 있습니다. Read After Write(RAW)해이는 제대로 값을 올라오는 것을 기다리고 , 이것이 일어나자 같은 데이터를 잘못 복식 여러 차례  문제가 일어납니다. 한편 Write After Read(WAR)해이 읽기 전에 쓰게 되는 문제로, 이는 서키궤시을 일으키고 데이터가 소실되는 문제로 하다.Write After Write(WAW)해이는 기입 순서가 어긋나는 문제에서 단순한 입출력 생각하지 않아도 좋습니다.이들 해이 파이프 라인 처리에서도 일어나므로   다시 해설합니다.

では、ここで簡単なディスプレイのインタフェースを考えましょう。このディスプレイは、 ASCIIコードを書き込むとその文字が出力されます。ASCIIコードとは、英数字、記号 用の8ビットの文字コードで、国際的に広く使われています。Linux端末ではman ascii で表示されます。ここでは、簡単のため、データレジスタとステータスレジスタを同じ 0x8000番地に割り当てます。すなわち、この番地に書き込むとディスプレイから表示 されます。この表示はシリアル転送で行われて一定の時間が掛かります。このため のTxRDYがこの番地の最下位ビットに割り当てられています。
그럼 여기서 간단한 디스플레이 인터페이스를 생각합시다.  디스플레이ASCII코드를 쓰면  글자가 출력됩니다. ASCII코드 숫자 기호용 8비트 문자 코드에서 국제적으로 널리 사용되고 있습니다. Linux단말기에서는 man ascii로 표시됩니다. 여기에서는 간단히, 데이터 레지스터 스테이터스 레지스터를 같은 0x8000번지에 할당합니다. 즉, 이 번지 쓰면 디스플레이에서 표시됩니다. 표시는 시리얼 전송에서 열리 일정 시간이 걸립니다.이를 위한 TxRDY 번지 최하위 비트 할당되어 있습니다.


この例題プログラムでは、r0にLDHIを使って0x8000を入れてやり、このデータを読 んで(LD)は、0だったらLoopに戻る(BEZ)動作を繰り返します。この操作でTxRD Yが1になるまで待ってやります。このループから抜け出したということはTxRDYが1 なので、データを書き込むことができます。ここでは‘A’の文字をディスプレイに出力 するために0x41をデータレジスタに書き込みます。このように、フラグが1になるまで ループしてチェックを繰り返す操作をビジーウエイト(Busy Wait)あるいはポーリング (Polling)と呼びます。

 예제 프로그램에서는 r0 LDHI 사용하고 0x8000 넣어 주어,  데이터를 (LD)는 0이면 Loop 돌아가(BEZ)동작을 반복합니다. 이 조작으로TxRD Y 1이 될 때까지 기다리게 합니다. 이 루프에서 벗어났다는 것은TxRDY 1이므로 데이터를 쓸 수 있습니다. 여기에서는 'A' 문자를 디스플레이에 출력하기 위해서 0x41데이터 레지스터에 기입합니다.이와 같이 플래그가1이 될 때까지 루프해서 표시 반복 조작을 비지 웨이트(Busy Wait)혹은 폴링(Polling)라고 부릅니다.

I/Oデータなどを扱う上での無駄を防ぐために、最近のCPUは16ビットではなく8 ビット単位で番地が振られています。すなわち、16ビットは番地二つ分に当たります。 ここで、桁の大きい方から0,1と振っていく方法と小さい方から0,1と振っていく方 法の二つが考えられます。前者をBig Endian,後者をLittle Endianと呼びます。POCO では以降、Big Endianで番号を振ることにします。この振り方は統一が取れておらず、 コンピュータ間でデータを交換する際にトラブルの元となります。最近のCPUは電源 投入時の指定でどちらの方法を取ることもできるものが多いです。
I/O데이터 을 다루는 데 낭비를 막기 위해서 최근 CPU 16비트가 아니라 8비트 단위로 번지가 흔들고 있습니다.  16비트는 주소 두개 분에 해당합니다. 여기서 자리 수의 큰 편에서 0,1으로 흔들고 가는 방법과 작은 편에서 0,1으로털어 가 법 두가지가 생각됩니다. 전자를 Big Endian, 후자를 Little Endian이라고 부릅니다. POCO에서는 이후 Big Endian로 번호를 흔들 합니다. 이 처신 통일이 풀리지 않고, 컴퓨터 간에 데이터를 교환할 때 화근이 됩니다.최근CPU는 전원 투입시 지정에 어떤 방법을 취하기도 할 수 있는 것 많습니다.



16ビットだと分かり難いですが、32ビットだと番号の付け方の違いの差がより分かり 易いかと思います。MSB側から0を振っていくと、大きい方で端(LSB: end)に達する ことからBig Endian, LSB側から0を振っていくと小さい方で端に達することからLittle Endianという名前になっていることが分かります。Endianとは奇妙な英語ですが、こ れはこの言葉が、ガリバー旅行記の卵の細い方から割る派(Little Endian)と太い方 から割る派(Big Endian)で内乱が起きる話に由来するためです。

16비트라고 알기 어렵지만 32비트라고 번호 부여 방식 차이의 차이가 보다알기 쉽다고 생각합니다. MSB측으로부터 0 털어 가 큰 편에서 단(LSB:end)에 이르는 것부터 Big Endian, LSB측으로부터 0 털어 가 작은 편에서 끝에 이르는 것부터 Little Endian이라는 이름으로 되어 있어요.Endian기묘한 영어지만 아이 이건 이 말이 걸리버 여행기  마른 편에서 깬 파(Little Endian)과 굵은 쪽에서 깨파(Big Endian)에서 내란이 일어나다 이야기에서 유래되기 때문입니다.


では、バイトデータを扱う命令を定義しましょう。LBは指定されたアドレスの8ビットを 読み出して、レジスタの下位8bitに置きます。上位8bitは符号拡張されます。RISCで はCPUの内部ではデータのサイズを統一してしまうのが普通です。この場合も読み 出す際に16ビットに拡張します。LDと同じR型で定義しましょう。

그럼 아르바이트 데이터를 다루는 명령을 정의합시다. LB 지정된 주소 8비트 읽어 내, 레지스터의 하위 8bit에 둡니다. 상위 8bit 부호 확장됩니다.RISC에서는 CPU내부에서는 데이터 사이즈를 통일는 것이 보통입니다. 이 경우 읽어 낼 때 16비트에 확장합니다.LD와 같은 R형에서 정의합시다.

I/Oは符号無しのデータを扱うことも多いので、ゼロ拡張の8bit読み出し命令も用 意しておくのが普通です。これがLBU(Load Byte Unsigned)で、上位8ビットには0が 入ります。
I/O는 부호 없는 데이터를 다루는 것도 많아 제로 확장 8bit출력 명령도,  두는 게 보통입니다.이것이 LBU(Load Byte Unsigned)에서 상위 8비트 0이 들어갑니다.

逆にレジスタ中の値を8ビット単位でメモリに書き込む命令がSB(Store Byte)です。こ の命令はレジスタの下位8ビットをレジスタ間接指定されたメモリの番地に書き込み ます。上位8ビットは無視されます。上位の情報がなくなっても困らないようにするの はプログラマの責任です。ちなみにSBはデータのサイズが減る方向なので、SBUと か作る必要はありません。
거꾸로 레지스터  값을 8비트 단위로 메모리에 저장 명령이 SB(Store Byte)입니다.  명령은 레지스터 하위 8비트를 레지스터 간접 지정된 메모리 번지 기입합니다. 상위 8비트 무시됩니다. 상위 정보가 없어져도 곤란하지 않도록 하는 거 프로그래머 책임입니다.참고로 SB는 데이터 사이즈가 줄어드는 방향이니 SBU 만들 필요는 없습니다.


バイトアドレッシングを導入すると今まで考えなくて良かった問題が生じます。バイト アドレッシングのメモリを今まで通りLD,ST命令で扱った場合、偶数番地から読めば 問題はありません。メモリ中のバイトの順番でそのままデータがレジスタに読み込ま れます。しかし奇数番地から読んだらどうなるでしょう。この例では1番地の8ビットを 上位にもってきて2番地の8ビットを下位にもってきてくっつける必要があります。この ように16ビット、32ビット、64ビットのデータがバイトアドレッシングの境界にうまく整 列していない問題をミスアラインメントと呼びます。

바이트 어드레싱 도입하면 지금까지 생각 없이 좋은 문제가 생깁니다. 아르바이트 어드레싱 메모리를 지금까지 대로 LD, ST명령으로 다룬 경우, 짝수 번지에서 읽으면 문제는 없습니다. 메모리  바이트 순서에서 그대로 데이터가 레지스터에 읽힙니다. 하지만 홀수 번지에서 보면 어떻게 될까요. 이 예에서는 가장  8비트 상위에 가져오고 2번지 8비트 하위에 가져오고 붙일 필요가 있습니다.이처럼 16비트, 32비트, 64비트의 데이터가 바이트 어드레싱 경계  세이 도열하지 않은 문제를 실수 얼라인먼트이라고 부릅니다.

ミスアラインメントを許すかどうかは難しい問題です。命令では許さないのが普通で す。データについては悩ましいです。ミスアラインメントは、16ビットのデータをアクセ スするのにメモリを2回に分けてアクセスするため、性能面では不利です。メモリ周 辺のハードウェアも複雑になります。利点はメモリ利用効率が向上することですが、 ミスアラインメントを許すことによるメモリの容量の効率化は効果がさほど大きくない です。ミスアラインメントを許すのは、主として、既に普及してしまったコード(レガ シーコード)で、ミスアラインメントを許す状態でコンパイルしてしまったものをコンパ イルしなおさなくても動くようにするため、という要求に基づく場合が多いようです。こ のため、データについては許す場合と許さない場合があります。POCOではもちろ ん両方共許さないことにします。
실수 얼라인먼트를 허용하는지는 어려운 문제입니다. 명령이 허용하지 않는 것 보통으로 하다. 데이터에 대해서는 괴로운입니다. 실수 얼라인먼트 16비트의 데이터 액세스  메모리를 2차례 접속, 성능 면에서는 불리합니다. 메모리  변의 하드웨어도 복잡하게 됩니다. 이점 메모리 이용 효율이 향상하는 것이지만 실수 얼라인먼트를 허용함에 따라메모리 용량 효율화는 효과가그다지 크지 않습니다. 실수 얼라인먼트를 허용하는 것은 주로 이미 보급되어버린 코드(레가  코드)에서 실수 얼라인먼트 허용 상태에서 컴파일하고 버린 것 뒤풀이 일본 다시 안 해도 움직이도록라는 요구에 근거한 경우가 많습니다. 그 때문에 데이터에 대해서는 용서하는 경우와 용서하지 않는 경우가 있습니다.POCO에서는 물론 양쪽 다 허용하지 않기로 합니다.

さて、ここまででI/Oについて紹介しましたが、いくつか問題があります。I/Oデー タは8ビットのASCIIコードや数ビットのフラグが多いので16ビットデータのうちの一 部しか使っていません。これはもったいないので、実は今のコンピュータは8ビット単 位のバイトアドレッシングを用いています。これについて紹介します。次に、ビジー ウェイト中CPUは無駄にループを回っていて馬鹿みたいです。この問題を解決する ための手法として割り込みを紹介します。
여기까지 I/O에 대해서 소개했지만 여러가지 문제가 있습니다. I/O데이 타는 8비트의 ASCII코드나 몇비트 플래그가 많아서 16비트 데이터  한부밖에 사용하지 않습니다. 는 아까워서 사실 지금의 컴퓨터는 8비트  정도 바이트어드레싱을 사용합니다. 이것에 대해서 소개합니다. 다음 비지 웨이트 CPU 낭비에 루프를 돌고 있 바보 같아요.이 문제를 해결하기 위한 방법으로 인터럽트를 소개합니다.

さて、今までのI/Oは、常にCPUの方からI/Oの状態を見に行かなければならないで す。このため、I/Oを行うと、他の処理ができなくなってしまいます。逆に何か処理を はじめると、定期的にI/Oを見に行かねばならず、大変です。考えてみると、I/Oが CPUに何か要求があっても、CPUが読みに行くまではそれを知らせる手段はありま せん。CPUの基本はとことん自分中心にできているのです。 これでは困るので、I/O側からCPUに対して要求を出す機構が生まれました。これが 割り込み(Interrupt)です。I/OはCPUに対して割り込み要求を出します。CPUはこれを 受け付けると、自動的にPCが割り込み処理ルーチンの先頭に変更されます。この際、 戻り番地はどこかに保存しておきます。割り込み処理ルーチンを実行し、終了後リ ターン命令で元のルーチンに戻ります。この際、元のルーチンは割り込みが起きな かったかのように実行されなければならないです。
자, 지금까지의 I/O는 항상 CPU I/O상태를 보러 가야 하. 이 때문에, I/O 하면 다른 처리를 할 수 없게 되어 버립니다. 오히려 뭔가 처리를 시작하면정기적으로 I/O 보러 가야 안 되고 힘들어요. 보면 I/O이 CPU에 무슨 요구가 있더라도, CPU가 읽으러 가까지는 그것을 알리는 수단이 있습니다요. CPU의 기본은 끝까지 자신 중심으로 생겨나고 있습니다. 이래서는 곤란하니까, I/O측에서 CPU에 대해서 요구를 내는 기구가 태어났습니다. 이것이 무너진다(Interrupt)입니다. I/O는 CPU에 인터럽트 요구를 냅니다. CPU는 이를 받는다고 자동적으로 PC가 인터럽트 처리 루틴의 선두로 변경됩니다. 이 때 돌아가번지는 어딘가에 보존하겠습니다. 인터럽트 처리 루틴을 실행하고 종료 후리 턴 명령에 원래의 루틴으로 돌아옵니다.이때 원래의 루틴은 새치기 일어난 브라운타카게 실행되야 합니다.


割り込みの実行は、サブルーチンコールと少し似ています。メインルーチンを実行中、 割り込みを許可にする命令(EI:Enable Interrupt)を実行した後、割り込み要求信号が 入ると、割り込み処理ルーチンの先頭に飛びます。ここから始まる割り込み処理 ルーチンを実行し、最後にRTI(Return from Interrupt)命令を実行すると、メインルー チンに戻って、処理を再開します。動作は似ているのですが、サブルーチンコールと 違って、どこで割り込みが掛かるかわからない点にあります。

새치기 실행은 서브 루틴 과 조금 비슷합니다. 메인 루틴을 실행 중 끼어들기를 허가로 명령(EI:Enable Interrupt) 실행한 후, 인터럽트 요구 신호가 들어가면 인터럽트 처리 루틴의 선두 납니다. 여기부터 시작되는 인터럽트 처리루틴을 실행하고 마지막으로 RTI(Return from Interrupt)명령을 실행하면 메인-으로 돌아가서 처리를 재개합니다.동작은 비슷하지만 서브 루틴 과 달리어디서 새치기 걸릴지 모르는 점에 있습니다.

割り込み関係の命令を紹介しましょう。EINT(Enable Interrupt)は割り込みを許可にす る命令です。CPUはリセットの際には割り込み禁止にしておきます。これはCPUの状 態をきちんと初期化する前に割り込みが掛かると適切に処理されないためです。必 要な初期化が終わるとEINT命令を実行し、割り込みを許可します。ちなみに割り込 みが掛かると自動的に割り込み禁止になります。 RTI(Return from Interrupt)は、割り込み処理ルーチンの最後に実行すると、戻り番地 を保存するレジスタの値をPCに入れることで、メインルーチンを再開します。このとき に割り込みを許可にします。
인터럽트 관계 명령을 소개합니다. EINT(Enable Interrupt)은 새치기를 허가로  명령입니다. CPU 리셋 에는 끼어들기 금지하고 있습니다.. 이는CPU상태 상태 제대로 초기화하기 전에 끼어들지만 다루면 적절히 처리되지 않기 때문입니다. 반드시 중요한 초기화가 끝나면 EINT명령을 실행하고 새치기를 허가합니다. 참고로 나누 미가 면 자동적으로 인터럽트 금지됩니다.RTI(Return from Interrupt)는 인터럽트 처리 루틴의 마지막 실행하면 돌아갈주소를 저장하는 레지스터 값을 PC에 넣음으로써 메인 루틴을 재개합니다.이때 새치기를 허가로 합니다.



割り込みが行ったときの飛び先はどのように設定すれば良いでしょうか?最も簡単 な方法は固定番地にしておくことです。POCOではこの方法をとり、ff00に飛ばすこと にしています。この方法では、だれが割り込みを掛けたかわからないので、割り込 み処理ルーチンの先頭でどのI/Oが出したのかを知るためにステータスレジスタを調 べる必要があります。信号処理用プロセッサやマイクロコントローラの中には、割り 込み要求信号によって、違った飛び先に飛べるようにしてあるもの、飛び先をテーブ ル引きにして自由に選べるようにしているものもあります。I/Oが少なければ、それぞ れの処理ルーチンの先頭に直接飛んでいくことができます。では戻り番地はどこに しまっておけばよいでしょうか?RISCではこのための特殊なレジスタを持たせており、 POCOではIAR(Interrupt Address Register)に戻り番地をしまっておきます。サブルー チンコールにハードウェアスタックを用いるCPUでは、これを戻り番地の格納にも使 います。

새치기 할 때의 비비선는 어떻게 설정하면 좋을까요?가장 간단한 방법은 고정번지 두는 것입니다. POCO에서는 이 방법을 취하고 ff00 날리고 있습니다. 이 방법에서는 누가 새치기를 었는지 모르기 때문에 비해포함 처리 루틴 선두에서 어떤 I/O 냈는지를 알기 위해서 상태 레지스터를 조사하 필요가 있습니다. 신호 처리용 프로세서나 마이크로 컨트롤러 중에는 분할  요구 신호에 의해서 다른 비비선 날게 하고 있으니 비비선 테ー 부산 할인해서 자유롭게 선택하게 하고 있는 것도 있습니다. I/O가 적으면 각각  처리 루틴 선두 직접 날아갈 수 있습니다. 그럼 돌아가번지는 어디에 넣어 두면 됩니까?RISC에서는 이를 위한 특수 레지스터를 알선했고, POCO에서는IAR(Interrupt Address Register)으로 돌아가번지를 간직하고 있습니다.서브- 콜로 하드웨어 스택을 이용하는 CPU에서는 이를 돌아가번지의 격납에도 사용합니다.


割り込みを実装するために、CPUは割り込み要求入力intreqを持っています。割り込 み要求線はオープンドレインといってどれかがLならば全体がLレベルになる信号線 を使います。I/Oのどれか(複数でも)が要求を出すと、intreq=Lとなって割り込みが 掛かります。割り込みが掛かり続けてCPUの処理が先に進まなくなることを防ぐため、 割り込み処理ルーチンに飛ぶと同時に割り込みは禁止なり、割り込み処理ルーチン は禁止のままで走ります。割り込み処理ルーチンないで別の割り込みを受け付ける のを多重割り込みと呼びますが、ここでは省略します。

새치기를 구현하기 위해서, CPU 인터럽트 요구 입력 intreq 가지고 있습니다. 수지 포함야선은 오ー풍도 레인 해서 어느 것인가가 L다면 전체가 L수준으로 되는 신호선을 사용합니다. I/O어느(복수라도) 요구를 내자 intreq=L이 되고 인터럽트 걸립니다. 끼어들기 걸리 CPU 처리가 먼저 돌아가지 않는 것을 막기 위한, 인터럽트 처리 루틴 날면 동시에 새치기하는 금지 되고 인터럽트 처리 루틴 금지 로 달립니다.인터럽트 처리 루틴 어서 다른 인터럽트를 는 것을 다중 인터럽트이라고 부릅니다만, 여기에서는 생략합니다.



では最後にI/Oに関するもう一つの問題点を取り上げます。I/Oから入力する場合、 LBで一度CPUのレジスタに取ってきて、SBでメモリにしまいます。これは2回コピー作 業を行っていることに相当します。

마지막 I/O에 관한 한가지 문제점을 다룹니다. I/O에서 입력할 경우 LB에서한번 CPU레지스터 취하, SB에서 메모리에 버립니다.이는 2차 복사   하고 있는 것에 해당합니다.

逆にI/Oから出力する場合はどうでしょう?LBでメモリからCPUのレジスタにデータを 取ってきて、そこからI/Oにデータを出力します。2回のコピーが必要です。これは、 CPUが常にメモリとI/Oを結ぶバスの利用権を握り続けているためです。
반대로 I/O에서 출력하는 경우는 어떨까요?LB에서 메모리로부터 CPU레지스터 데이터를 뽑, 거기서 I/O 데이터를 출력합니다. 2차 사본이 필요합니다.이는 CPU 항상 메모리와 I/O 잇는 버스 이용권을 잡고 있기 때문입니다.

DMA(Direct Memory Access)は、この問題を解決するための方法です。まずI/Oから DMA要求を出します。CPUは受付可能であれば、DMAを許可し、バスの利用権を開 放します。I/OはCPUに代わってバスを使って、直接メモリとの間でデータを交換しま す。DMAは一度にデータを転送するブロック転送(バースト転送)に向いていて、大 規模なデータを高速に転送するのに使われます。終了後はバスを開放し、CPUに利 用権を返します。CPUのプログラムはDMAが掛かったことを知らないので、必要があ れば割り込みを掛けて知らせてやる必要があります
DMA(Direct Memory Access)는 이 문제를 해결하기 위한 방법입니다. 우선 I/O에서 DMA요구를 냅니다. CPU 접수 가능하면 DMA 허용하고 버스 이용권을  습니다. I/O CPU대신 버스를 이용하, 직접 메모리와 사이에서 데이터 주고받습니다. DMA는 한번에 데이터를 전송하는 블록 전송(버스트 전송)에게 유리하며 대대 규모의 데이터를 고속으로 전송하는데 쓰입니다. 끝나면 버스를 개방하고 CPU 이용권을 갚겠습니다.CPU 프로그램은 DMA걸린 것 모르므로 필요가 있레바 새치기를 걸어  할 필요가 있습니다


반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading