web-dev-qa-db-ja.com

CPUはIOポートのピンを直接操作できますか?

私がこれまでに知っていることに基づいて、IOデバイスをIOポートに接続するとき(たとえば、プリンタをパラレルポートに接続するとき) 、プリンタはCPUに対して別のRAMチップとして表されます。

したがって、プリンタと通信するデバイスドライバを作成する場合、デバイスドライバに含まれる命令は、単にデータをプリンタのメモリ位置に格納する命令と、プリンタのメモリ位置からデータをロードする命令です。

しかし、パラレルポートのピンを直接操作してデータをプリンタに送信できますか。つまり、CPUには次のような命令がありますか。

send the number 3 to pin 0 of parallel port 1
1
John

これまでにわかったことに基づいて、IOデバイスをIOポートに接続すると(たとえば、プリンターをパラレルポートに接続すると)、プリンターが表示されますもう1つのRAMチップとしてCPUに接続します。

このシナリオは、1つのデバイス(パラレルポートコントローラー)が別のRAMチップとしてCPUに提供される場合とされない場合(およびほとんど提供されない場合)の2つの別個のデバイスと考えるとよい他のデバイス(プリンタ)はCPUにまったく提示されません。プリンタにバイトを送信するために、プリンタのドライバはパラレルポートコントローラのドライバにバイトを送信するように要求し、パラレルポートコントローラのドライバはパラレルポートコントローラにバイトを送信するように指示します。

RAMチップには特別な特性があることに注意してください-読み取りと書き込みには副作用がありません。副作用がないため、パフォーマンスを向上させるためにいくつかのトリックを使用するのは簡単です。キャッシュを持つ、小さな読み取りまたは書き込みを少数の大きな読み取り/書き込みに結合する、または異なる順序で読み取りまたは書き込みを行うようなものです。ほとんどの場合、デバイスのレジスタには副作用があるため、RAMチップと同じように扱うことができないことがよくあります。

しかし、パラレルポートのピンを直接操作してデータをプリンタに送信できますか。つまり、CPUには次のような命令がありますか。

CPUに物理アドレス空間があり、物理アドレス空間が4 GiBであり、各物理アドレスが32ビットアドレスであると仮定することから始めましょう。

物理アドレス空間(アドレス0x00000000〜0x7FFFFFFF)の2 GiBがRAMに使用され、その領域での読み取りと書き込みにCPUがパフォーマンス(キャッシュなど)を向上させるためのトリックを実行するとします。

また、物理アドレス空間の残りの2 GiB(アドレス0x80000000から0xFFFFFFFF)がさまざまなデバイスに使用される可能性があると仮定します(CPUはこの領域への読み取りと書き込みのトリックを実行しません)。

最後に; CPUに任意のアドレスの読み取りまたは書き込みを行う命令があると仮定しましょう。 (1つのアドレスで)アプリケーションの変数を読み取る(たとえば)同じ命令を使用して(たとえば)(別のアドレスで)パラレルポートコントローラーのレジスタを読み取ることができます。

この場合、CPUがデバイス用の特別な命令を持つ必要はありません。

しかしながら...

一部のCPUには、複数のアドレス空間があります。たとえば、80x86の場合、(上記で説明したような)物理アドレス空間がありますが、「IOポートアドレス空間」もあります。この場合、CPUには、特別なアドレス空間にアクセスするために使用されるいくつかの特別な命令(たとえば、「IOポートアドレス空間」にアクセスするためのinおよびout命令)があり、これらの特別な命令は物理アドレススペースの読み取りまたは書き込みを行う通常の命令とは異なる動作をします(たとえば、MMUをバイパスするか、まったく異なるアクセス許可チェックを伴う場合があります)。

3
Brendan

それはもはやそのようには機能しません(パーソナルコンピュータの場合)。しかし、昔は、安価なコンピュータはいわゆるメモリマップドI/Oを使用していました。デバイスコントローラーチップは、CPUが1つの連続したメモリアドレス空間を認識するようにコンピューターに配線されましたが、スペクトルの一部はメモリチップの位置とは相関せず、デバイスコントローラーチップの制御レジスタとデータレジスタと相関していました。 CPUはこれを「認識」せず、プログラマーだけが認識しました。そのため、コントローラチップに意図したとおりの動作をさせるには、特定の順序で特定のメモリ位置にバイトを書き込む必要がありました。

2
Martin Maat

デバイスドライバレベルでは、メモリマップドアクセスになります。セットアップ情報とコマンドを特定のアドレスに書き込み、特定のアドレスを読み取って、それがどのように応答するかを確認します。プリンタポート(コンピュータの一部)とプリンタ(ケーブルのもう一方の端にあり、それ自体はメモリマップされていない)を区別してください。

また、最近の一部の周辺機器インターフェースは、他のタイプのコントローラーの背後に隠れていることに注意してください。したがって、設計が簡単な場合は、プリンタポ​​ートが実際にUSBインターフェイスに接続されている可能性があります。その場合、CPUはプリンタポ​​ートに直接ではなく、USBバスコントローラと通信します。

1
Simon B