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

這個問題其實沒有什麼意思,知道了問題的答案能表明一個人技術水平有多高嗎?不能!這個問題有答案以及有意義嗎?答案都是沒有!那我還爲何一直對這個問題死死揪住不放?這類問題可以提高一個人的素質以及瞭解一段關於網絡和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的手段罷了。 本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/dog250/archive/2010/02/09/5303699.aspx
發佈了17 篇原創文章 · 獲贊 1 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章