2012-04-08 5 views
2

最終的に私たちが書くコードは、最終的にアセンブラと機械語に変わります。ネットワークのマシンコードはどのように見えますか?

アセンブラを作成していて、2台のコンピュータ間の単純な接続を実行する場合、アセンブラ内で使用するメモリアドレス(オフセットは除く)はどのように分かりますか?オペレーティングシステムに関連する特定のアドレスを知る必要がありますか?

本当に「クリーン」で効率的なメッセージをライブラリ/コンパイラに渡している人は、私にはネットワーク通信/ IPCがアセンブラのように見えますか?

この回答の一部は、OSに関連する既知のアドレスを照会していると考えられますか?例えば、0x4545456から0x60000000には、通信用のLinuxカーネルデータが含まれています。

+0

これは非常に一般的な質問ですので、私はあなたに非常に長時間巻き込まれた一般的な答えを与えました。より具体的であれば、より具体的な回答が得られます。アセンブラは自動的にクリーンで効率的であるとは言えませんが、それより複雑です。 –

答えて

1

このアドレスはお使いのOSに固有のものではありません。あなたのハードウェア/システムに固有のものです。それらにアクセスすることは、アセンブラと他のプログラミング言語(Cなど)とは関係がありません。実際にはほとんどのデバイスドライバコード(ネットワークハードウェアと実際にやりとりするコード)は通常C言語で記述されます。

ランダムサンプルネットワーク(イーサネット)コントローラの:

Intel® 82580EB/82580DB GbE Controller: Datasheet

は、お使いのソフトウェアは、いずれかのアセンブラで、または別の言語で、実際にはイーサネット経由で通信するには、この事を取得するためにプログラムすることがあるレジスタの束があります。直列ポートのような簡単な例から始める方が簡単でしょう。今お使いのソフトウェア

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では、ハードウェアとの実際のやりとりはdevice driverで実装されています。ユーザーソフトウェアは、APIを使用してデバイスドライバとデータを交換できます。ここでも、このユーザーコードはアセンブラまたは他の言語で記述することができます。 APIはOSによって異なります。通信/ネットワーキングは、一般に、より低いレベルのものより高いレベルのプロトコルが実装された「stack」として構築されます。このスタックのどの部分がユーザライブラリにあるか、またはOSの一部であるかは、オペレーティングシステムによって異なります。

私が上で説明した仮想デバイスの場合、APIは2つのシングルバイトブロッキングコール、read()およびwrite()で構成されます。アセンブラまたは上位レベルの言語のいずれかのメカニズムを使用して、これらを呼び出してパラメータを渡したり、出力を取得したりすることができます。一部のオペレーティングシステムでは、デバイスI/OはファイルI/Oのように見えるので、デバイス上で操作を実行するために汎用ファイルの読み取り/書き込みを使用するため、OSはそれらを適切なデバイスドライバにディスパッチします。さらに、典型的なOSでは、実際のシステムコールは、さまざまなプログラミング言語から呼び出すことのできるライブラリの種類によって利用できるようになります。

0

実際にネットワークを行うためにオペレーティングシステムによって使用されるカーネルコードと、ネットワーク上でどのデータを送信するかをOSに伝えたいと考えています。

通常、マシンのハードウェアには、ネットワークハードウェアとの通信専用の特定のメモリアドレスがあります。 OSのマシンコードは、このメモリに適切な値を書き込んで、送信および受信バイトを終了するハードウェアを制御します。これらのメモリアドレスはマシンコードにハードコードされます。

ネットワーキングを行うユーザーコード(Mozilla Firefoxなど)の場合、プロセスが異なります。典型的には、ユーザコードがオペレーティングシステムに何らかのタスク(例えば、syscall、MIPSではint命令を使用すると思われる)を実行するように指示するために使用される機械命令または命令セットが存在する。クライアントコードは、適切なデータを持つバッファをネットワークに送信するように設定し、上記のアセンブリ命令の1つを使用して、データを送信する必要があることをOSに伝えます。その後、ハードウェアはOSを起動し、OSはユーザデータを読み取り、それ自体のマシンコード(上記)を使用して実際にネットワークデバイスを適切に制御します。このようにして、OSは、デバイスを制御する物理アドレスへのアクセスをブロックし、システムコールを通じてアクセスを緩和することによって、ネットワークデバイスへの直接アクセスを保護することができる。また、ネットワーキングを行うためのユーザコードを書くときに、メモリアドレスを知る必要はありません。 OSはこれらの詳細を処理し、システムコールをトリガーするために実行する命令は何かを知る必要があります。

希望すると便利です。