web-dev-qa-db-ja.com

CPUは周辺機器とどのように通信しますか?

cPUがマザーボードのBIOSとRAMに直接アクセスできると思います。

しかし、CPUはHDD、拡張カード、周辺機器、その他のBIOSなどの他のハードウェアとどのように通信しますか?

私はOSとそのドライバについて知っていますが、それらはソフトウェアであり、RAMにあります。 cpuはハードウェアレベルでこのすべてのハードウェアとどのように通信しますか?マザーボードのBIOSとRAMだけに制限されていませんか?

28
DrStrangeLove

以前のアーキテクチャでは、特別なI/O命令を使用してメモリアクセスする別のメカニズムを介して周辺機器にアクセスしていました。 x86では、CPUとペリフェラルの間でバイトを転送するための「in」および「out」命令がありました(現在もそうです!)。周辺機器には、たとえばキーボードの0x80などのアドレスが与えられました。大幅に簡略化して、「0x80で」実行すると、キーボードコントローラからCPUレジスタ「AL」にバイトが読み込まれます。

最新のアーキテクチャでは、ペリフェラルはメモリと同様の方法でアクセスされます:バス上のマップされたメモリアドレスを介して。バスをメモリにアクセスする方法として考えるべきではありません。これは、メモリ(RAM/DDR)が1つのタイプにすぎない個々の周辺機器をアドレス指定する方法です。たとえば、2GBのRAMがアドレス0x00000000..0x7fffffffにある場合があります。その後、グラフィックカードが0x80000000..0x80001fffにある場合があります。バスコントローラ(PCIeなど)は、どのアドレスを認識しているか範囲はどのペリフェラルに行きます。

メモリは通常、キャッシュできるという点で特別です。したがって、メモリへの個々の読み取り/書き込みは、RAMチップへの個々の読み取り/書き込みに直接変換されない傾向があります。周辺機器は特別なものとしてマークされています-CPUアクセスプログラムに書かれているとおりにペリフェラルに出てください。

周辺機器と通信する言語は、デバイスによってはアドホックです。一般的なテーマは、ペリフェラルがメモリ内のどこかにマッピングされ(たとえば、上記のように数KBの場合は0x80000000)、状態の個々のビットとアクションが異なるワード(通常32ビットまたは64ビット)によって制御されることです。 0x80000000のシリアルポートの神話的な例:

  • 32ビットのワード「A」を0x80000000に書き込み、出力FIFOの文字「A」をキューに入れます。
  • 32ビットのワード0x1を0x80000004に書き込みます。これは、キューを送信するようシリアルポートに指示します。

繰り返しになりますが、例のためだけに完全に構​​成されていますが、実際のシリアルポート(uart)はそれほど違いはありません。

問題は、仮想メモリが原因で、最近のOSでは実際に上記のメモリレイアウトがseeにならないことです。上記のアドレスは、「物理メモリアドレス」(またはバスアドレス)と呼ばれます-バスに出て行く実際のアドレス。代わりに、CPUは仮想メモリアドレスを認識します。個々の周辺機器は、仮想アドレス空間にマッピングする必要があります。これは説明が複雑で、おそらく別の質問でお勧めしますが、最新のOSでは実際の物理アドレスで周辺機器にアクセスすることはほとんどありません。

41
John Ripley

もちろん、受け入れられた回答は正確ですが、DrStrangeLoveは他の何かに対処することを意図していたか、少なくとも、質問は別の回答に対応しています。実際、誰かが「周辺機器はハードウェアレベルでCPUとどのように通信するのですか?」と尋ねると、答えはI/Oモジュールの役割(誰もが知っているI/Oアダプターのような)に言及する必要があると思います。 I/Oデバイスと通信するために必要なロジックの一部がI/Oモジュール内に組み込まれ、I/O操作を実行するときのCPUの注意の必要性を減らすため、これは強調することが重要です。これは、I/O操作のハードウェアの側面について質問するので、質問のコンテキストでは私に関連して聞こえます。アダプターはI/Oデバイスの本質を抽象化し、CPUから複雑さを隠しているハードウェアです(そしてOSからも)。たとえば、ディスクアダプターはディスクのジオメトリの側面を非表示にし、CPUがディスクのプレートを回転させるために必要なロジックを実行し、シリンダーを見つけ、正しいセクターが読み取り/書き込みヘッドの下を通過するのを待ちます。同様の理由が、ビデオアダプターやネットワークカードなどの他のデバイスにも当てはまります。簡単に言えば、I/Oモジュールがなければ、I/OタスクはCPUを圧倒します。ストールを引用するには:

I/Oモジュールは、プロセッサーが幅広いデバイスを簡単な方法で表示できるように機能します。提供される可能性のある機能の範囲があります。 I/Oモジュールは、タイミング、フォーマット、および外部デバイスの電気機械の詳細を隠して、プロセッサが単純な読み取りおよび書き込みコマンド、場合によってはファイルコマンドの開閉を実行できるようにします。最も単純な形式では、I/Oモジュールは、デバイスを制御する作業(たとえば、テープの巻き戻し)の多くをプロセッサに表示したままにすることができます。詳細な処理負荷のほとんどを引き受け、プロセッサへの高レベルのインターフェースを提供するI/Oモジュールは、通常、I/OチャネルまたはI/Oプロセッサと呼ばれます。かなり原始的で詳細な制御が必要なI/Oモジュールは、通常、I/Oコントローラーまたはデバイスコントローラーと呼ばれます。 I/Oコントローラーは一般的にマイクロコンピューターで見られますが、I/Oチャネルはメインフレームで使用されます。

さらに、John Ripleyが正しく述べたように、RAMと同じ方法でマップされるI/Oスペースがあります。実際、周辺機器は直接がメモリアドレス空間にマッピングされます(これは[〜#〜] mmio [〜#〜]として知られています、メモリマップI/O)。 、または区切られたアドレススペース[〜#〜] pmio [〜#〜]、「分離I/O」とも呼ばれるポートマップI/O "MMIOとは異なり、I/OアドレスはコンピュータのRAMのアドレスから完全に分離されているためです。このため、デバイスと通信するためにinおよびout命令を使用する必要がありますPMIOを使用)。

上記により、MMIOとPMIOはI/Oデバイスをメモリ位置として扱います。これは、ハードウェアがI/O操作を処理する方法の本質ですが、ここで言及する価値のある豊富な概念的負荷を取得するために、さらに詳しく説明します。 I/O。各アダプタのアドレス範囲は限られているため、このようなメモリ位置はデータバッファとして機能することを理解する必要があります。つまり、一度にデバイスと通信するためのバイト数(「データブロック」)がわずかしかないことを意味します。このため、CPUはこれらのメモリ位置から読み取るデータを直接使用しないのが一般的です。最初に、対応するアドレスを介してI/Oデバイスからデータが読み取られ、次にこのデータがRAMそして、その時のみCPUはそれを使用できます。これを取得するために、CPUが実行する必要がある大きなバイナリファイルを考えてください。ディスクアダプタには、I/Oアドレス空間によって制限された制限付きのバッファがあります(アダプタの内部バッファではなく、 CPUから見たアドレス空間)、したがって、アダプターはディスクから一部のデータを読み取り、割り込みを介してバッファーがいっぱいになるとCPUに警告します。次に、CPUは実行中の処理をすべて中断し、バッファを読み取り、バッファの内容をRAMにコピーし、ディスクからさらにデータを継続して取得できることをアダプタに通知します。このサイクルは、RAMに完全にロードされると、バイナリファイルまで繰り返されます。その時点から、読み取り操作が終了したと宣言され、ファイルを最終的に実行できます。

このサイクルはinterrupt-driven I/Oと呼ばれ、完全にハードウェアで発生します(割り込みを処理するために一部のOSがサポートされています)が、I/O操作を実行する別の2つのオプションがあることに注意してください。いわゆるPIO(プログラマブルI/O)を使用することも可能です。割り込みメカニズムを使用する代わりに、CPUは必要なすべての情報がブロックごとに収集されるまで(最後のブロックがが取得され、ループが終了します)。割り込み駆動のI/OとPIOはどちらもCPU時間を浪費し(特に後者)、I/Oデバイスがデータを直接(またはfrom)RAM CPUの指示に従って。そのプールの性質のため、PIOは完全にソフトウェアで実装されていると思いますが、現時点では間違っている可能性があります。 DMAはPIOと割り込み駆動I/Oを古くしましたが、どちらも現代のアーキテクチャーから禁止されているかどうかはわかりません。

私が間違っていたら訂正してください。基本的にペリフェラルデバイスは[〜#〜] pci [〜#〜](ペリフェラルコンポーネントインターコネクト)を使用してプロセッサと通信します。これは、デバイスを直接に接続するバスのタイプです。プロセッサ。コマンドが周辺機器(キーボードのボタンを押すなど)を介して与えられると、バイナリコードに変換されてキャッシュメモリの形式でメモリに格納され、その特定の機能に必要な実行がプロセッサによって実行されます。

0

それは、「直接アクセス」の意味によって異なります。 CPUコアは バス を介してメインメモリ(RAM)と通信します。 (コアは比較的少量のメモリ(キャッシュまたはレジスタ)に直接アクセスできますが、それは別の問題です。)CPUはバスを介して周辺機器とも通信します。あなたが聞いたことがあるかもしれないいくつかのタイプのバスは、ユニバーサルシリアルバス(USB;通常は外部デバイス用)、PCI、フロントサイドバス(CPUコアとメインメモリを接続するバスのタイプ)、またはシリアルATA(SATA;よく使用される)ですハードディスクなどのデバイス用)。

ETA:以下のコメントで、デバイスドライバーがCPUと周辺機器間のハードウェアレベルの通信を処理することを述べました。通信の実際の仕組みでは、アドレススペースの特定の部分を使用してデータを転送する( メモリマップI/O )ため、デバイスからの物理的な読み取りまたは書き込みは、通常のメモリにアクセスするように見えます。デバイスドライバーは、CPUがデバイスから interrupts に応答する方法も扱います。

0
Asher L.