アドレスはOSに固有のものではありません。それらはハードウェア/システムに固有です。これらへのアクセスは、アセンブラーと別のプログラミング言語(Cなど)とは関係ありません。実際、ほとんどのデバイスドライバーコード(ネットワークハードウェアと実際に対話するコード)は通常、Cで記述されています。
ネットワーク(イーサネット)コントローラーのランダムサンプルを1つだけ示します。
インテル®82580EB/82580DBGbEコントローラー:データセット
アセンブラまたは別の言語のソフトウェアが、イーサネットを介して実際に通信するためにプログラムする必要のあるレジスタがたくさんあります。シリアルポートのような単純な例から始める方がおそらく簡単です。メモリにマッピングされた、架空の固定ボーレートのシリアルポートコントローラを作成してみましょう。
Address Meaning
0 RX status (reads 0 when no data to read, 1 a byte is available)
1 RX buffer
2 TX status (reads 0 when ready to send, 1 when busy)
3 TX buffer
これで、ソフトウェアは、アセンブラまたは他の言語で、アドレス2を監視(ポーリング)して準備が整うまでデータを別のコンピュータに送信し、次のバイトをアドレス3に書き込むことができます。監視(ポーリング)によって別のコンピュータからデータを受信することもできます。 )アドレス0は、データの準備ができているかどうかを確認し、データがそこにあるときにアドレス1からバイトを読み取ります。
最新のオペレーティングシステム/OSでは、これらはすべて物理アドレスであり、何らかの方法で仮想アドレスにマッピングする必要があります。
私がリンクしたような実際のハードウェアは通常、割り込みを使用するため、ポーリングする必要はありません。通常はDMAが搭載されているため、ハードウェアはデータをバイト単位でフィードするのではなく、データに直接アクセスできます。さまざまなプロトコルを処理し、このプロトコルのさまざまな側面をチェックおよび設定するためのレジスタを備えています。
最新のOSでは、ハードウェアとの実際の相互作用はデバイスドライバーに実装されており、ユーザーソフトウェアはAPIを介してデバイスドライバーとデータを交換できます。この場合も、このユーザーコードはアセンブラーまたはその他の言語で記述できます。APIはOSによって異なります。通信/ネットワーキングは通常、「スタック」として構築され、低レベルのプロトコルの上に高レベルのプロトコルが実装されます。このスタックのどの部分がユーザーライブラリにあるか、またはOSの一部にあるかは、オペレーティングシステムによって異なります。
上記で説明した架空のデバイスの場合、APIは2つのシングルバイトブロッキング呼び出しで構成されている可能性がありread()
ますwrite()
。次に、アセンブラまたは高級言語のいずれかからのある種のシステムコールメカニズムを使用して、これらを呼び出し、パラメータを渡したり、出力を取得したりします。一部のオペレーティングシステムでは、デバイスI/OがファイルI/Oのように見える場合があるため、汎用ファイルの読み取り/書き込みを使用してデバイスで操作を実行すると、OSがそれらを適切なデバイスドライバーにディスパッチします。さらに、一般的なOSでは、実際のシステムコールは、さまざまなプログラミング言語から呼び出すことができる、ある種のライブラリを介して利用できます。