Ethernetのしくみとハードウェア設計技法

Ethernetのしくみとハードウェア設計技法―プロトコルの詳細からネットワーク対応機器の作成まで (TECHI―Bus Interface)

Ethernetのしくみとハードウェア設計技法―プロトコルの詳細からネットワーク対応機器の作成まで (TECHI―Bus Interface)

日本語で読めるethernetハードウェアの内容としては最上級のものと実感。
やはり日本語技術書ではこういうムックが最も詳しいのですね。
これでダメなら原著の仕様書にあたるしかない。

  • プリアンブルとSFD (Start Frame Delimiter)
    • 受信側がタイミング調整を行うために利用する。
    • MIIでは、「プリアンブルの先頭部分は取りこぼしても可」としている。
    • プリアンブル: "10"を28回繰り返す56bit
    • SFD (Start Frame Delimiter): 101010"11"
    • どっちが一般的なのだろうか。とりあえず手元のlinux環境でpingさせてWiresharkすると、Ethernet IIで見える。個人的にはIEEE802.3形式は見たことがない気がする。
  • Ethernetのレイヤ1
    • PLS (Physical Layer Signaling): 01情報をマンチェスタ符号化する所
    • AUI: 基板またはLSI内部の配線にすぎない。
    • MDI: 単なるRJ-45コネクタのこと。
  • carrier senseの方法
    • ネットワーク上に電位差が見えるかどうかで判断
  • colision detectionの方法
    • 送信データがネットワーク上にあることを確認する。
    • 衝突が分かった送信側は途中からデータでなくジャム信号を送信し、受信側に衝突を正しく知らせる。
  • 1000Base-Tと1000Base-TX
    • 1000Base-TXは、100Base-TXと同じ信号速度である125MHzを4ペア使う。
    • 1000Base-Tは、そうではない。カテゴリ6が良い。
  • リンクパルス
    • 10Base-Tでは、リンクパルスを出し続けることでethernet接続を検出していた。
    • 100Base-TXでは、アイドル状態でも、伝送路上に"1"が連続して送信される(MLT-3的には電位が常に変化ている)ので、ethernet接続検出は、明示的なリンクパルス無しでもできる。
  • Power over Ethernet
    • IEEE802.3af
    • 通信に使っている送受信ペアを使うタイプと、通信に未使用な送受信ペアを使うタイプと、がある。
  • PAUSEフレームとMACコントロール
    • PAUSEは、CSMA/CDのジャム信号の代わり「速度の異なるリンク間で通信するため」に導入されている。
    • PAUSEのフォーマット
    • MACコントロールについて
      • Ether Type 8808h
      • パケット長は、Ether frameの最小値である64byte固定。
      • etherframeの中身に、オペコード(PAUSEの場合は0001h)とパラメータ(PAUSEする時間長)が入っている(実際はPAUSE機能のみ定義されている)
      • Etherframeの宛先は、PAUSEの場合は、01:80:C2:00:00:01とされる。
  • ethrnetコントローラ配置方法分類
    • CPU(チップ)にMACもPHYも内蔵
      • PHYはアナログなので、高速なCPUと同一プロセスで製造できない。よって低速なもののみ。
    • CPU(チップ)にMACだけ内蔵, PHYは外付け
      • CPU(MAC)とPHYとの間のインタフェースはMII, GMII, XGMIIになる。
    • 単体(MACとPHY別々かも)
      • システムバスとの接続形態として、PCIバスや、その他汎用バスのものがある。
  • 汎用バスタイプとPCIバス接続タイプの比較
    • 汎用バスタイプ
      • CPU負荷が高い。高機能なものだとDMAが使える。
      • CPUが忙しいと取りこぼしがありうる。受信割込みの優先度をあげたりして対応。
    • PCIバス接続タイプ
      • 普通はバスマスタ転送対応なので、CPU負荷は無し。ただしPCIバス用にそれなりのハードウェアリソースが必要。
  • Intel 8255Xシリーズの使いかた
    • メインメモリ上に「コマンドブロック」と呼ばれるデータを用意して、i8255xに読み込ませる。この「デバイスがメインメモリをアクセスする」ところは、NE2000等の古くからあるNICと異なる点ですが、ギガビットEthernetコントローラや高機能SCSIコントローラ等、高性能を求められるデバイスでは良く見られる方式です。
    • コマンドブロックをリンク(数珠つなぎ)にできる。ELビットがゼロであれば、リンクアドレスを参照して次のコマンドブロックを連続して処理する。高スループットな送信や受信ができる。
    • 送信用のコマンドブロック。データ格納領域はポインタとして保持。こうすることで、実データは連続したメモリに格納しておきながら、ether frameとして分割して送信指示できる。(もしこれがないと、実データをether frameとして送信するための分割しながらコピーする必要がある)
  • Intel 8255Xシリーズ PHYへのアクセス
    • ドライバソフトウェアがPHYを操作するには、MDI (Management Data Interface)を通じてPHYの持つレジスタをアクセスします。
    • MDIは、MDIO (Input/Output)と、MDC (Clock)からなる2線式シリアルインタフェースです。
    • 例えば、PHYの初期設定や、リンク状態の取得のためには、PHYへのアクセスが必要。
  • キャッシュの整合性問題が発生する理由
    • 通常は、CPUがキャッシュを介してメインメモリにアクセスするのみで、この場合だけ考えていれば、キャッシュとメインメモリの整合性が崩れることはない。
    • しかし、 バイスが直接メインメモリにアクセスと、メインメモリとキャッシュの間で値の不整合が起こる。
    • ドライバが書いた値をデバイスが直接読もうとすると...
      • ドライバアクセスはキャッシュ経由なので、書き込みはキャッシュに留まっているのみでメインメモリに反映されていない可能性がある。そのため、デバイスが直接メインメモリにアクセスするとデータが古い可能性がある。
    • バイスが直接書いた値をドライバ(ソフトウェア)が読もうとすると...
      • CPUキャッシュの値は古いままの可能性がある。
    • 解決策?
      • 例えば、読み取りの際にキャッシュを無効化するとか。
      • 書き込んだときに、write throughする。
  • Realtek RTL8139シリーズの使いかた
    • 安価で必要充分な機能を持つため広く使われる。(WoLも)
    • 送受信方法は独特で高スループットを望めない構造。
    • PCIバスにさしてつかうように設計されている。
  • MII (Media Independent Interface)
    • PHY(カッパーや光)とMAC(L2)との間のインタフェース
    • MIIといった場合は10/100Base-TX
    • ロジックだけからなるMACと、PHYを分けて実装する場合、MIIが採用される。
    • 信号
      • 受信用, 送信用, 半二重制御, マネージメント制御, の信号で構成される。
      • MIIは内部インタフェースだが、ケーブルで接続することも想定されており、その場合は、D-Sub40ピンコネクタが使われる。
      • PHYから常時提供されるタイミング信号がある(RX-CLK)。とはいえ、受信フレームのデータ線からクロック情報を得ることができる変調方式である場合は、そちらを使っても良い。
      • 送信用にもPHYから常時提供されるタイミング信号がある(TX-CLK)。
      • マネージメント制御系信号としてMDIO (management data input/output), MDC (management data clock)がある。
      • MDIOはPHYの状態確認や制御のために用いられる。
      • より具体的には、PHYからオートネゴシエーションの結果を受け取ったり、PHYに対して、モード(例えば全二重固定等)を指定したりするために使う。
      • MDCは、MDIOのために用いるタイミング(クロック)情報
    • フレーム送受信
      • 送信時は、信号線の数にあわせて4bitパラレルに変換する。
      • LSI内部や基板上の高速配線では多くの場合、「立上り送信,立上り受信」等の同相処理を行う。しかし、基板間の接続では、逆相処理を行う(「立上り送信,立下がり受信」)。信号がもっとも安定した状態であることが期待できるから。
    • マネージメントインタフェース(MDIO, MDC)
      • 一つのSTA(MAC)から複数のPHYが制御できる。
      • MDIO端子は3ステートが用いられている。 3ステートとは、出力端子において、0信号の出力, 1信号の出力, 伝記的に出力部をバスから切り離す(ハイインピーダンス), の三つの状態を持つもの。一般にバスに接続する端子で用いられる。バス上の全端子がハイインピーダンスになると、バスの状態が不安定になるので、一般には抵抗をつないでプルアップあるいはプルダウンにし、「全端子ハイインピーダンス時には0になる/1になる」ように決めておく。
    • Linuxでは、該当ドライバがEthernet互換であることを事前に宣言することにより、IPレイヤとドライバの間で etherフレーム-IPパケット自動変換の機構が働く。ソケットバッファが役立っている。
    • ソケットバッファ(skb...)
      • head: ヘッダの先頭
      • data: ヘッダとデータの間
      • tail: データのお尻
      • dev: 操作するドライバを登録
      • protocol: Ethernet等のデータタイプを指定
      • Ethernet用のnet_device構造体 (usr/src/linux/include/linux/netdevice.h) を作る。alloc_etherdevカーネルコールにより、net_device構造体をkmallocで配置し、初期化する。初期化には、name, wachdog_timeo, dev_addr(MACアドレス), 上位プロトコルレイヤへのメソッド, を指定する。
    • ドライバモジュールアンロード時の処理(cleanup_module)
      • 割込みルーチン解除 (free_irq): 割込みハンドラとIRQとの関係を断ち、デバイスからの割込みを無視するようになる。