次のネットワークトポロジがあるとします。
4つのホストすべての理論的合計(Tx + Rx)帯域幅を合計すると、最大100 Mbpsです。今私が実行するとIPOV4つのホストすべてが同時にUDPモードにあり、各Iperfインスタンスが-b 50m
有線(Iperfクライアント上)で50Mbpsのトラフィックを送信するように強制すると、Iperfは有線からそれほど多くのトラフィックを送信しません。これは、NIC が競合を受信し、Iperf クライアントが-1
UDP ソケットから一部のシステムコールの戻り値を受信したためです。write()
カーネルとIperfクライアントがどのように通信しているのか理解していますが、NICとカーネルがどのように通信しているのかはよくわかりません。 NICドライバ(tg3
BCM5721 NIC用)でこれが起こりますか?クラッシュが発生したことをカーネルに知らせる一種のシステムコールはありますか?
ベストアンサー1
カーネルとNICが通信する方法は、カーネル(特にカーネルの一部であるデバイスドライバ)が他のデバイス(キーボード、マウス、RS232などのシリアル通信デバイス)と通信する方法と同じです。 )、ディスク(またはディスク)と同じ方法で - 大容量記憶装置、ディスプレイ、セキュリティトークンなど) - 互いに直接通信します。はい。これはNICドライバで発生します。いいえ、ドライバとデバイスの通信はシステムコールを通過しません。
デバイスドライバは、通常、MMIO(メモリマッピングI / O)とPMIO(ポートマッピングI / O)の2つのアクセス方法を介してデバイスと通信します。これについて詳しく説明し、議論する。根 これら2つの質問のうち:
また、見ることができますドライバとは何ですか?どのように機能しますか? 背景情報が必要な場合。ところで、どのアクセス方法が使用されるかは、コンピュータアーキテクチャによって決定される。例えば、ウィキペディア「メモリマップされたI / Oが優先されます。x86建築に基づいて...」
具体的な質問に戻って、メモリマップされたI / Oを仮定すると、ドライバは次のようにCコードとの競合を簡単にテストできます。
if(nic->error_status&クラッシュ) { //衝突が発生した場合はここで停止します。 (衝突を処理するコード) ⋮ }
(ここでnic
NICマッピングアドレスへのポインタ)ドライバがシステムコールからユーザープロセスにエラーを返すようにすることはマイナーな問題ですwrite()
。
フォローアップの質問:
ドライバがカーネルの一部であるということは、ドライバ⇔カーネル通信方式がないという意味ですか?
これは別の質問で尋ねる価値があります(または少なくともWeb検索などの追加の調査を実行します)。最初はUnixコア以前はしっかりと組んで一つになっている (あなたも見ることができますフルカーネル)。カーネルとドライバの関係は人体と手の関係と同じです。その他、 肘や肺などと混同しないでください。しかし、体の不可欠な部分です。
4つの機械でも保護リング、Unix はリング 0 のカーネルとリング 3 のユーザ領域、2 つだけを使用します。デバイスドライバがフォークやナイフなどの他のオペレーティングシステムもあります。つまり、1つのレベルが削除されました(たとえば、ドライバが中間リング(1および1./または2)のいずれかにあります)。私はすべての* nix / Linux開発に追いついていません(例:リニアKM)、一部のUnixは他のUnixよりも基本的なカーネルとドライバを分離することができます。例えば
- カーネルドライバとカーネルモジュールの違いは何ですか? (存在するUnixとLinux)
- Linuxカーネル、カーネルモジュール、ハードウェアドライバ … (外部ウェブサイトから)
私が言ったように、これは私の知識ベースの端にあります。上記の後続の質問をしないでください。
さらに、質問は意味上あいまいです。体と手の間にコミュニケーションがありますか?はい。神経系を通して(そしてある程度は骨を通して)可能です。 「カーネル」はデバイスドライバ(カーネルの一部)と通信しますか?はい。 Cプログラム(たとえば、、、、、など)は、サブルーチン呼び出しを介してcat
(時々グローバル変数を慎重に使用して)Cライブラリと通信するのと同じです。ユーザープロセスがI / O関連のシステムコール(たとえば、、、、、、、など)を呼び出すと、一般的なシステムコール処理コード(カーネル内)は適切なデバイスドライバルーチン(おそらくいくつかの中間ロジックを使用して呼び出す)を呼び出します。します。 )。ファイルシステム固有のコードも適切なディスクドライバルーチンを呼び出します。そして、カーネルは、少なくとも割り込みが受信されたときにデバイス固有の割り込みハンドラを呼び出すのに役立ちます(実装はさまざまです)。cp
ls
sed
open()
close()
read()
write()
ioctl()
poll()
select()