What?
通常驅動程式和OS核心一起執行在核心態!如Linux這種巨集核心的OS更是如此!所以驅動程式一旦實現的有問題,則直接導致OS掛掉!所以Linux對於驅動程式的開發技術、規範、執行等都有嚴格的限制!從而導致核心態驅動程式難以編寫和除錯!Linux的哲學一切皆是檔案!所以Linux將硬體的讀寫和管理抽象為統一的API, 主要形式就是對於檔案的讀寫和管理。
傳統的OS如Linux/Windows等一般都會將硬體抽象封裝起來,遮蔽其細節,統一其介面!從而使之易用!一般網路應用程式需要和網絡卡硬體互動則呼叫OS提供的統一介面,如socket等,同時從使用者態切換到核心態,並且需要將應用讀寫硬體的data在核心態和使用者態之間複製! 還要經過網路協議棧逐層處理,然後到達網絡卡buffer, 最後網絡卡執行實際的data收發和中斷的觸發!
如果每秒併發connection比較少的情況下,一般幾千個時,也就是C10K級別以下,效能還可以的!可以一旦上升到一萬,十萬,百萬,千萬級併發connection時,作業系統首先就扛不住了!所以國外大牛寫了一篇文章主要觀點就是:對於C10M級別下的併發connection處理,作業系統核心並不是解決方案,反而是效能瓶頸所在!
所以User Space Driver技術就被提出!思想很單純和直接, 如果這個硬體就為你一個應用程式服務,比如網絡卡, 那麼最好由應用程式自己在User Space 模式下直接管理和讀寫硬體!最好無需OS參與!當然讓OS完全不參與也未必好!比如可以讓OS只擔任介紹人, 剩下的事你倆自己搞定,OS樂得清閒自在!應用程式與硬體直接互動,硬體中斷也由應用程式自己處理,避免了無謂的上下文切換和data複製!對於網絡卡硬體而言, 網路應用程式可以根據應用需要只執行定製的最小化最單一的網路協議棧!最大限度避免做無用功和過多的層級!而且編寫使用者態驅動程式可不像編寫核心態驅動程式有那麼多技術限制,可以充分自由發揮利用各種技術,最大化開發利用硬體的速率潛力!好囉嗦呀,我說清楚了吧。
Which?DPDK、Snabb、ixy等使用者態驅動開發框架。
使用者態Driver實現核心方法歸類Mapping memory to user space(將OS核心態的記憶體map到user space中供App直接讀寫)UIO driversVFIO driversUser-space network drivers(將硬體的暫存器和buffer等直接map到user space態的記憶體區域中直接供App讀寫操控,相比較上面123而言最徹底撇開OS)當然它也有難點:硬體中斷處理、應用重啟或崩潰時硬體如何管理、沒有形成統一的硬體訪問介面、硬體如何共享、管理各種硬體記憶體buffers、執行自己的網路協議棧,如:TCP/IP 。優點那就是快!撇開了OS這個效能瓶頸後,User Space Driver可以最大化開發利用硬體速率!實現使用者態Driver的核心原理我參閱了一些資料, 妄自揣測,如有謬誤,希望指教。
目標:將硬體的各種暫存器和data buffer等直接map(對映)到應用程式所在的User Space模式下的記憶體區域,從而實現應用程式只需讀寫相應的記憶體區域,就可以配置管理讀寫硬體!同時還要將硬體中斷map(對映)給此應用程式,由應程式自己處理硬體中斷,事件通知和dispatch等。所以如DPDK等User Space Driver 開發工具包就是幫助我們實現此目標!同時降低複雜度!所以明白了關鍵點後,我們就可以從容地學習各種開發工具包!因為萬變不離其宗!
實現難點主要難點有二, 第一就是硬體中斷如何處理,第 二就是如何將硬體,如網絡卡的各種暫存器和buffer對映到使用者態應用程式的記憶體下?我著重談一下第二點:
核心態driver和OS核心一起都執行在核心態, 人家活在真實的世界, 記憶體地址就是真實實體地址, 不是虛擬地址!而每個應用程式活在虛擬的世界裡, 好似獨佔記憶體,可那個記憶體是OS給它虛擬出來的!所以是虛擬記憶體地址!所以需要經過MMU和OS配合才能轉換成真實的記憶體地址,才能讀寫data!
問題來了, 以前硬體都歸OS核心統一管理,人家是體制內的人, 現在要下海單幹脫離體制, 難點在於應用程式如何為這個硬體分配指定真實的實體記憶體地址!應用程式有這個能力和權利嗎?學過作業系統虛擬記憶體的朋友應該了解, OS分配給應用程式的虛擬記憶體實際對應到那塊真實實體記憶體是動態變化的!完全由OS決定, OS不高興的話也可以把你直接swap到硬碟上去!反正你手裡拿著飯票,而飯在哪裡完全由OS說了算!哈哈!
既然硬體,如網絡卡需要真實的實體記憶體地址才能實現對映!同時還要保證那塊真實的實體記憶體區域一直不變,始終分配給應用程式和硬體使用!那麼使用者態的應用程式如何滿足呢?! 不同的開發包,如DPDK等都有自己的trick(黑科技) 。
所以知道了核心原理、目標、難點後,再去學習各種User Space Driver技術開發包就不容易暈乎了!
OS瓶頸傳統的作業系統,諸如Unix/Linux封裝了所有硬體並充當其代理,對外提供統一的API, 好處是易於使用和共享硬體!缺點就是會成為制約硬體效能的瓶頸!因為做什麼都需要通過OS的轉接排程!比如:負責使用者態緩衝區向核心態緩衝區的複製, 反之亦然等。
OS的核心任務在於掌控CPU和記憶體,從而可以公平高效地排程執行緒執行!其他的任務可以適當地下放給應用自己搞定。
老碼農水平有限,精力有限, 倉促成文,難免謬誤,望諸君諒解!
老於愛聊天, 聊聊技術、觀點、風景, 喜歡軍事、登山、旅遊!老於內涵豐富,不會侷限在某一個領域,談天說地,侃大山,人生本就不易,別太苛責別人,也別難為自己,聊一聊,笑一笑就過去了!
我是老於,希望大家支援我!
本篇文章之前我寫好放到git , hub上了,今天拿出來丟醜,哈哈!