天天看點

網卡的組成工作原理之一--MAC+PHY

網卡工作在osi的最後兩層,實體層(PHY)和資料鍊路層(MAC,即MAC實作了一個資料鍊路層),實體層定義了資料傳送與接收所需要的電與光信号、

線路狀态、時鐘基準、資料編碼和電路等,并向資料鍊路

層裝置提供标準接口。實體層的晶片稱之為PHY。資料鍊路層則提供尋址機構、資料幀的建構、資料差錯檢查、傳送控制、向網絡層提供标準的資料接口等功能。

以太網卡中資料鍊路層的晶片稱之為MAC控制器。很多網卡的這兩個部分是做到一起的。他們之間的關系是pci總線接mac總線,mac接phy,phy接

網線(當然也不是直接接上的,還有一個變壓裝置)。

下面繼續讓我們來關心一下PHY和MAC之間是如何傳送資料和互相溝通的。通過IEEE定義的标準的MII/GigaMII(Media

Independed

Interfade,媒體獨立界面)界面連接配接MAC和PHY。這個界面是IEEE定義的。MII界面傳遞了網絡的所有資料和資料的控制。

而MAC對PHY的工作狀态的确定和對PHY的控制則是使用SMI(Serial Management

Interface)界面通過讀寫PHY的寄存器來完成的。PHY裡面的部分寄存器也是IEEE定義的,這樣PHY把自己的目前的狀态反映到寄存器裡面,

MAC通過SMI總線不斷的讀取PHY的狀态寄存器以得知目前PHY的狀态,例如連接配接速度,雙工的能力等。當然也可以通過SMI設定PHY的寄存器達到控

制的目的,例如流控的打開關閉,自協商模式還是強制模式等。

我們看到了,不論是實體連接配接的MII界面和SMI總線還是PHY的狀态寄存器和控制寄存器都是有IEEE的規範的,是以不同公司的MAC和PHY一樣可以協調工作。當然為了配合不同公司的PHY的自己特有的一些功能,驅動需要做相應的修改。

一片網卡主要功能的實作就基本上是上面這些器件了。

其他的,還有一顆EEPROM晶片,通常是一顆93C46。裡面記錄了網卡晶片的供應商ID、子系統供應商ID、網卡的MAC位址、網卡的一些配置,如SMI總線上PHY的位址,BOOTROM的容量,是否啟用BOOTROM引導系統等東西。

很多網卡上還有BOOTROM這個東西。它是用于無盤工作站引導作業系統的。既然無盤,一些引導用必需用到的程式和協定棧就放到裡面了,例如RPL、

PXE等。實際上它就是一個标準的PCI

ROM。是以才會有一些硬碟寫保護卡可以通過燒寫網卡的BootRom來實作。其實PCI裝置的ROM是可以放到主機闆BIOS裡面的。啟動電腦的時候一樣

可以檢測到這個ROM并且正确識别它是什麼裝置的。AGP在配置上和PCI很多地方一樣,是以很多顯示卡的BIOS也可以放到主機闆BIOS裡面。這就是為什

麼闆載的網卡我們從來沒有看到過BOOTROM的原因。

2。工作過程,

PHY在發送資料的時候,收到MAC過來的資料(對PHY來說,沒有幀的概念,對它來說,都是資料而不管什麼位址,資料還是CRC),每4bit就增加

1bit的檢錯碼,然後把并行資料轉化為串行流資料,再按照實體層的編碼規則(10Based-T的NRZ編碼或100based-T的曼徹斯特編碼)把

資料編碼,再變為模拟信号把資料送出去。收資料時的流程反之。現在來了解PHY的輸出後面部分。一顆CMOS制程的晶片工作的時候産生的信号電平總是大于

0V的(這取決于晶片的制程和設計需求),但是這樣的信号送到100米甚至更長的地方會有很大的直流分量的損失。而且如果外部網現直接和晶片相連的話,電

磁感應(打雷)和靜電,很容易造成晶片的損壞。

再就是裝置接地方法不同,電網環境不同會導緻雙方的0V電平不一緻,這樣信号從A傳到B,由于A裝置的0V電平和B點的0V電平不一樣,這樣會導緻很大的電流從電勢高的裝置流向電勢低的裝置。我們如何解決這個問題呢?

這時就出現了Transformer(隔離變壓器)這個器件。它把PHY送出來的差分信号用差模耦合的線圈耦合濾波以增強信号,并且通過電磁場的轉換耦合

到連接配接網線的另外一端。這樣不但使網線和PHY之間沒有實體上的連接配接而換傳遞了信号,隔斷了信号中的直流分量,還可以在不同0V電平的裝置中傳送資料。

隔離變壓器本身就是設計為耐2KV~3KV的電壓的。也起到了防雷感應(我個人認為這裡用防雷擊不合适)保護的作用。有些朋友的網絡裝置在雷雨天氣時容易

被燒壞,大都是PCB設計不合理造成的,而且大都燒毀了裝置的接口,很少有晶片被燒毀的,就是隔離變壓器起到了保護作用。

10BaseT和100BaseTX PHY實作方式不同: 10BaseT采用曼徹斯特編碼,100BaseTX采用4B/5B編碼。

曼徹斯特編碼,常用于區域網路傳輸。在曼徹斯特編碼中,每一位的中間有一跳變,位中間的跳變既作時鐘信号,又作資料信号;從高到低跳變表示"1",從低到高

跳變表示"0"。還有一種是差分曼徹斯特編碼,每位中間的跳變僅提供時鐘定時,而用每位開始時有無跳變表示"0"或"1",有跳變為"0",無跳變為

"1"。