網卡工作在osi的最後兩層,物理層和資料連結層。
物理層的晶片稱之為PHY。物理層定義了資料傳送與接收所需要的電與光訊號、線路狀態、時鐘基準、資料編碼和電路等,並向資料連結層裝置提供標準介面。
乙太網路卡中資料連結層的晶片稱之為MAC控制器, 資料連結層則提供定址機構、資料幀的構建、資料差錯檢查、傳送控制、向網路層提供標準的資料介面等功能。
MAC和PHY之間的關係是PCI匯流排接MAC匯流排,MAC接PHY,PHY接網線(當然也不是直接接上的,還有一個變壓裝置),很多網卡的這兩個部分是做到一起的。
PHY和MAC之間互連的介面是IEEE定義的標準:MII/GigaMII(Media Independed Interfade,介質獨立介面)。MII介面傳遞了網路的所有資料和資料的控制。
寫文章的這天有人在網上問, 如果作業系統沒有載入網卡驅動,網卡雖然在系統裝置樹上,但網卡介面建立不了,那網卡實際能不能接收到資料?
下面是我在網上討論的整理:
這裡面有很多細節, 我根據Intel網卡的Spec大概寫了寫, 想盡量寫的通俗一些,所以沒有刻意用Spec裡的術語,另外本文雖然講的是MAC/PHY,但光口卡的(SERDES)也是類似的。
1. PCI裝置做reset以後進入D0uninitialized(非初始化的D0狀態, 參考PCI電源管理規範),此時網卡的MAC和DMA都不工作,PHY是工作在一個特殊的低電源狀態的。
2. 作業系統建立裝置樹時,初始化這個裝置,PCI命令寄存器的 Memory Access Enable or the I/O Access Enable bit會被enable, 這就是D0active。此時PHY/MAC就使能了。
3. PHY被使能應該就可以接收物理鏈路上的資料了,否則不能收到FLP/NLP, PHY就不能建立物理串連。但這類包一般是流量間歇發送的.
4. 驅動程式一般要通過寄存器來控制PHY, 比如自動協商speed/duplex, 查詢物理鏈路的狀態Link up/down。
5. MAC被使能後, 如果沒有驅動設定控制寄存器的一個位(CTRL.SLU
)的話, MAC和PHY是不能通訊的, 就是說MAC不知道PHY的link已經ready, 所以收不到任何資料的。這位設定以後, PHY完成自協商, 網卡才會有個Link change的中斷,知道物理串連已經Link UP了。
6. 即使Link已經UP, MAC還需要enable接收器的一個位(RCTL.RXEN
),包才可以被接收進來,如果網卡被reset,這位是0,意味著所有的包都會被直接drop掉,不會存入網卡的 FIFO。老網卡在驅動退出前利用這位關掉接收。Intel的最新千兆網卡發送接收隊列的動態配置就是依靠這個位的,重新設定的過程一定要關掉流量。
7. 無論驅動載入與否, 發生reset後,網卡EEPOM裡的mac地址會寫入網卡的MAC地址過濾寄存器,
驅動可以去修改這個寄存器,現代網卡通常支援很多MAC地址,也就是說,MAC地址是可以被軟體佈建的。例如,Intel的千兆網卡就支援16個單播
MAC地址,但只有1個是存在EEPROM裡的,其它是軟體聲稱和設定的。
8. 但如果驅動沒有載入,網卡已經在裝置樹上,作業系統完成了步驟1-2的初始化,此時網卡的PHY應該是工作的,但因為沒有人設定控制位(CTRL.SLU)來讓MAC和PHY建立聯絡,所以MAC是不收包的。這個控制位在reset時會再設定成0。
9. PHY可以被軟體佈建加電和斷電, 斷電狀態除了接收管理命令以外,不會接收資料。另外,PHY還能工作在Smart Power Down模式下,link down就進入省電狀態。
10. 有些多口網卡,多個網口共用一個PHY, 所以BIOS裡設定disbale了某個網口, 也未必會把PHY的電源關掉,反過來,也要小心地關掉PHY的電源。
11. 要詳細瞭解PHY,最終還是要熟悉IEEE乙太網路的相關協議。