web-dev-qa-db-ja.com

OSは他のハードウェアコンポーネントとどのように通信しますか?

CPU(主にOS)で実行されているプログラムはどのようにして他のPCハードウェアにアクセスできますか?グラフィックカード、HDDなど?

私が読んだところによると、DOSでは、これはBIOS呼び出し、特にINT命令を使用して行われました。ただし、INT命令は、RAM内の特定のスペースにのみジャンプする必要があります。では、CPUがRAMにしかアクセスできず、割り込みを受信できるのに、RAMに格納されているプログラムが他のコンピュータハードウェアにアクセスするにはどうすればよいでしょうか?

WindowsはINT命令も使用しますか、それともハードウェアと通信するための新しい方法はありますか?

7
Jack

[H]他のPCハードウェアにアクセスしてCPU(主にOS)で実行をプログラムできますか?グラフィックカード、HDDなど?

この質問に対する完全な答えは複雑で、一般的に答えるのは困難です。それで、私は一般的にそれに答えようとします、そしてうまくいけば、さらなる学習のための追加情報を見つけるためのいくつかの指針をあなたに与えるでしょう。これがお役に立てば幸いです。

MS Windows 95以降またはx86(IA-32)プロセッサ上のLinuxで使用される32/64ビット保護モードの場合、ソフトウェア割り込み( x86のINTopcodeなど)適切な 割り込みベクタテーブル (またはディスパッチテーブル)に移動します。これにより、OS内でプロセスが 割り込みハンドラ にジャンプする場所をCPUに指示できます。 =(または割り込みサービスルーチン、ISR)要求を処理します。

X86では real-mode 、MS-DOSのように、これらは [〜#〜] bios [〜#〜] によって処理される可能性があります。その特定のシステム/チップセット/マザーボード。

[H] CPUがRAMのみにアクセスでき、割り込みを繰り返す場合、RAM他のコンピューターのハードウェアにアクセスできるプログラムはありますか?

だからあなたはいつもの 手波 答えを望まないのですか?私はこれに答えようとしますが、私はコンピューターエンジニアでもコンピューターアーキテクチャの専門家でもありません。

を含むさまざまなメカニズムがあります

(Src: CS 473-IO 、ニューメキシコ州立大学、ファイファー、2006年)

最も単純なのはメモリマップドI/Oで、メモリアドレスがハードウェアデバイスのレジスタ(例:シリアル [〜#〜] uart [〜#〜] )とCPUにマップされ、書き込みと書き込みが行われます。 /または特定のメモリアドレスを読み取って、ハードウェアに直接アクセスします。これは高速でシンプルですが、RAMとして使用できるメモリアドレス範囲が狭くなります。

その他は、最新のCPUとより高度なオペレーティングシステムが制御された方法でハードウェアにアクセスできるようにするために開発された、より高度な技術です。

OS自体では、これらは通常、サポートするハードウェアデバイスに関する特定の詳細が含まれているため、デバイスドライバーと呼ばれます。

また、Windowsはint命令も使用しますか、それともHWと通信するための新しい方法はありますか?

はい、はい、しかし私はそれを説明したと思います。

9
mctylr

PCのCPUで実行されているソフトウェアが、残りのハードウェアと通信する方法はいくつかあります。

最も理解しやすいのはI/Oポートです。ソフトウェアは、OUT命令を使用して、一度に8、16、または32ビットをI/Oポートに書き込みます。同様に、ソフトウェアはIN命令を使用してI/Oポートから読み取ります。 I/Oポートは、メインメモリが使用するアドレス空間とは関係なく、別の16ビットアドレス空間に存在します。 I/Oポートを使用する各ハードウェアには、さまざまなI/Oアドレスがあります。これらの各アドレスへの書き込みと読み取りには異なる効果があります(同じアドレスからの読み取りと同じアドレスへの書き込みにも異なる効果があります)。

もう1つの方法は、メモリマップドI/Oです。この場合、メモリアドレス空間の一部がハードウェアの一部にマップされます。メインメモリに移動する代わりに、メモリのその領域との間の読み取りと書き込みは、対応するハードウェアに移動します。それらの意味は、ハードウェアとリージョンによって異なります(同じハードウェアに複数のメモリマップドI/Oリージョンがあることは珍しくありません)。読み取りと書き込みは特別な効果をもたらす可能性があり(I/Oポートで一般的です)、または単にハードウェア上のメモリ(たとえば、ビデオカードのフレームバッファ)に対して直接読み取りと書き込みを行うことができます。

他の方向(CPUで実行されているソフトウェアと通信する残りのハードウェア)には、いくつかの方法もあります。最も簡単な方法は、ソフトウェアが要求するのを待つことです(I/OポートまたはメモリマップドI/Oのいずれかを介して)。単独で使用すると、これは非常に非効率になる可能性があります。

もう1つの方法は、ハードウェアがメインメモリに直接書き込むことです。これは、大量のデータを転送するのに非常に効率的であり、他の方向にも使用できます(メインメモリから読み取るため)。ただし、ソフトウェアは転送がいつ終了するかを知る必要があります。

最後の方法は割り込みです。 CPUは、割り込み番号とともに割り込み要求を受信します。 CPUは(したがって名前で)何をしていたかを中断し、コードの別の部分(どの部分は割り込み番号に依存します)に切り替えます。通常、各ハードウェアは1つの割り込み番号に対応しますが、割り込み番号は多くの場合、複数の割り込みソースで共有されます。番号のない特殊な種類の割り込みもあります。たとえば、NMI。


実際の例として、簡単なネットワークインターフェイスカードを見てみましょう。このネットワークカードには一連のレジスタがあり、I/OポートまたはメモリマップドI/Oのいずれかを介してアクセスできます。メインメモリからの読み取りとメインメモリへの書き込みも可能で、割り込みピンがあります。

パケットをネットワークに送信するために、ネットワークカードドライバは最初に、4バイトの倍数にアラインされたアドレスで完全なパケットをメモリに書き込みます。次に、ネットワークインターフェイスカードのいくつかのレジスタに書き込み、メモリアドレス、パケットサイズ、およびその他の情報を通知します。次に、ネットワークカードはメモリからパケットを読み取り、ネットワークに送信して、割り込みを通知します。割り込みコントローラー(別のハードウェア)は、CPUに割り込み要求を送信し、それに割り込み番号を通知します。割り込みハンドラーでは、ドライバーはカードからレジスターを読み取り、割り込みが送信されたパケットに関するものであることを通知し、別のレジスターを読み取って送信されたパケットを見つけ、パケットを書き込んだ場所のメモリを再利用できることを認識します。 。

ネットワークからパケットを受信するために、ネットワークカードドライバは、パケットのストレージとして使用されるメモリブロックを割り当て、メモリブロックのメモリアドレス、そのサイズ、およびその他の情報をカードに通知するいくつかのレジスタをカードに書き込みます。 。ネットワークからパケットを受信すると、ネットワークカードは、パケットのサイズやその他の情報とともに、そのパケットをそのメモリブロックに書き込みます。いくつかのレジスタを更新して、メモリのそのブロックにある空き領域の量、空き領域の開始場所、および使用済み領域の開始場所を通知します(バッファは循環しているため、最後に到達した後、ロールオーバーします。最初に)。最後に、割り込みを通知します。ドライバはレジスタとメモリを読み取ってパケットを取得し、レジスタを更新して、スペースが再び空いていることをカードに通知します。

カードがレジスタに書き込み、割り込みを通知することでドライバに通知できることは他にもあります。たとえば、ネットワークケーブルが抜かれている、伝送エラーが発生したなどです。

4
CesarB

探しているのは " [〜#〜] irq [〜#〜] "、ハードウェアからCPUへの割り込み要求です。基本的な記事があります ここ

1
Satanicpuppy

それがハードウェアドライバの目的です。さらに、WindowsはDOSの代わりにHAL(ハードウェアアブストラクションレイヤー)を使用するようになりました。

0
Wilf