1. 程式人生 > >再談linux中為何沒有網卡設備文件--深層次原因

再談linux中為何沒有網卡設備文件--深層次原因

實現 打開 edi details net ... led 個人 電路

這個問題其實沒有什麽意思,知道了問題的答案能表明一個人技術水平有多高嗎?不能!這個問題有答案以及有意義嗎?答案都是沒有!那我還為何一直對這個問題死死揪住不放?這類問題可以提高一個人的素質以及了解一段關於網絡和unix的歷史,正是因為這些都很有趣,才如此值得關註。

在unix中,一切io相關的實體都被抽象成了文件,之所以抽象成文件第一是為了接口統一,第二是為了操作統一,第三是為了策略隱藏,比如這樣可以向用戶屏蔽掉具體設備的細節或者具體文件系統的細節,文件抽象有塊抽象和字符抽象,對於塊文件,你只需要知道它可以隨機讀寫就可以完成大部分的工作而不用關註底層具體的文件系統,比如ext3,ntfs,jfs之類,對於字符設備文件,你只需要知道他們是串行讀寫就可以了,而不必關心鼠標的電路安排,打印機的內部機制等等,但是對於網卡,我們看看它是字符設備還是塊設備。如果它是塊設備,那麽它能隨機讀寫嗎?看看網卡的特性,它的另一端是另一個世界,它更像是一個管道,它更像是一個字符設備,因為對一個管道進行隨機讀寫是沒有意義的,那麽它是一個字符設備嗎?要知道網絡協議多種多樣,計算機僅僅負責按照協議加工數據而不對協議本身做任何限制,因此如果將網卡作為字符設備,那麽為了支持眾多協議以及為了在傳輸之前綁定一個協議,就必須頻繁調用ioctl之類的系統調用,這樣用戶就必須知道網卡這個設備的更多的細節,否則用戶怎麽去ioctl這塊網卡,這顯然違背了unix文件抽象的初衷,另外怎麽去同步這個設備,比如多個進程同時需要打開這個設備傳輸網絡數據,怎麽能保證它們可以用最高的效率復用這個網卡,這個同步工作應該由誰來做,系統還是用戶,如果由系統來做,傳統的文件同步接口將在網卡設備文件失效,如果由用戶來完成,那麽用戶必須對網卡像驅動工程師一樣熟悉,一個用戶弄壞網卡的一個寄存器就會導致整個網卡down掉...第三,如何支持網絡協議,難道讓用戶自己進行協議封裝然後write到網卡嗎?協議棧在這種情況下必須在用戶空間實現,如此一來,效率和健壯性呢?安全性呢?協議棧顯然受不到操作系統的內核空間特權級別的保護待遇,這違背了安全原則。綜上,網卡不能被抽象成設備文件,因為將之抽象之後得不到任何好處。

bsd套接字解決上文件抽象問題,為了使用文件接口,bsd套接字仍然使用文件接口,下層直接和內核空間的協議棧接口,所有的同步以及協議規程都在協議棧完成,設備復用由協議棧和設備驅動共同完成,這個bsd套接字抽象簡直就是一件藝術品,人們又回到了一切皆文件的美麗又和諧的世界,bsd套接字通過一個新的系統調用socket來代替open從而可以實現諸如協議綁定之類的和open語義不相關的操作,另外connect和accept也實現了自己的語義。當初為何不將網絡設備作為文件抽象呢?實際上有一個本質的原因,那就是unix根本就不把網絡通信作為IO,而是作為IPC,實際上unix從一開始就將網絡當成了計算機,否則它也不會將網絡通信作為IPC,進程間通信可以在同一臺機器,也可以在不同的機器,實際上機器並不是界限。unix將網絡通信當成了像共享內存,信號量之類的IPC機制了,只不過後者是同一臺機器內部的機制,不需要硬件,而網絡通過需要硬件實現,硬件就是網卡之類的設備,unix僅僅將網絡設別作為了實現IPC的手段罷了。

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

再談linux中為何沒有網卡設備文件--深層次原因