天天看點

windows的分層驅動--核心實作的一種方式

古老的unix提出了一切皆檔案的思想,近代的OO提出了一切皆對象的理論,在unix的年代,人們迫切需要的是如何操作計算機而不是如何設計軟體,畢竟那個時候軟體設計其實比現在簡單,就那麼幾種,關鍵是沒有人會操作計算機,而OO年代,軟體成了一種工業産品,此時不管是追求利潤也好,XX也罷,人們的計算機操作水準被windows拉到了一個很高的層次--如此複雜菜單加菜單的方式。使用軟體成了人們日常生活的一部分,是以問題就成了如何快速開發出軟體,是以也就有了OO,甚至更新的面向YY程式設計。windows正好出現在unix年代和OO年代交替的時期,是以注定成為了一個很成功的作業系統,我不關心windows的應用,這個随便一個人都能說很多,僅僅從windows核心的設計上來講,就有無限樂趣,當然我最喜歡的還是linux,不過這兩種作業系統在設計哲學上真的各有可取之處。

在核心中,windows使用兩個概念包含所有的核心子產品,這就是driver和device,當然真正的文檔會用大寫字母表示,這也是windows的一貫作風,為了展現OO,還會加上下劃線和大寫的object等字樣來定義結構體。認真看了windows關于核心的資料和親自調試了一番之後我覺得windows核心真的不錯,任何對核心的請求幾乎都可以用irp來表示,irp請求的發起者是使用者,而執行者正是device,具體怎麼執行就是driver的事情了,這是典型的C/S模型,很是清晰。人們可以輕松的對核心行為進行過濾,這是因為windows的核心模型是由device-driver-irp實作的,而後者就是一個分層的模型,一個device可以被“綁定”到任何一個别的device的上面,所有的device組成一個裝置棧來共同實作使用者的請求,裝置棧中的各個裝置可以由相同的driver來提供服務,也可以由不同的driver來提供服務,以網絡資料過濾為例,雖然linux的netfilter已經是很成功的了,寫死了5個鈎子,人們能實作的僅僅是過濾政策,而對過濾點幾乎不能做什麼,但是對于windnows的分層模型,過濾點可以随意設定,隻需要attach一個需要被過濾的device即可,而過濾政策由該自定義的device的driver來提供,是不是很靈活呢?我們姑且不考慮安全問題,僅從設計上講,windows就比linux靈活很多很多,然而安全畢竟是作業系統的首先要考慮的因素,是以linux會更加安全,因為linux中的過濾點幾乎都是寫死的,從netfilter到lsm都是寫死的代碼,除非你完全修改了核心,否則想通過加載一個核心子產品來實作一些不可告人的事情會比windows困難很多很多,比如想過濾檔案系統的讀寫請求,linux沒有提供現成的device供你attach,暴露給你的隻有file_operations,你需要做的就是替換掉這個結構體中的回調函數指針,然後還要做很多善後處理,這顯然不是一種标準的做法,标準的做法就是自己實作一個file_operations,然而除非你修改核心,否則核心絕對不會給你提供一個在一個fops上attach另一個fops的核心API的,而對于windows,這卻成了最簡單的事情,直接attach一個卷,然後實作過濾,是以windows中暴露給你的是device而不是driver,driver隻是為一個或一系列device實體提供服務的,别的什麼也不做,反過來device不關心自己的操作怎麼實作,你隻需要用擁有另一個driver的device來attach這個device即可,irp往下流動時會按照先經過綁定device在經過真正device的順序流動,所有的這些接口linux都沒有提供,linux提供的接口不允許你修改任何核心機制,允許修改的僅僅是核心機制的實作政策,或者核心子產品中允許你實作一個和目前核心不搭界的特有功能,比如netfiler和lsm事先确定不可更改的過濾點,然後允許你自己實作政策,過濾點是不能更改的。

很多人都說windows不安全,而linux安全,這是因為在linux上很多人都被限制使用root權限,而對于windows,由于它是個人作業系統,最起碼說它偏向于個人或者中小型伺服器,人們大肆的開發administrator權限,是以才導緻了不安全,我敢說如果給了linux所有使用者root權限的話,那麼linux也不會安全到哪去。先在考慮另外一個問題,那就是如果linux被給了root權限,而windows也被授予了administration權限的話,攻擊linux困難在哪?對于windows來講,你可以寫一個驅動來實作任何事情,核心雖然不讓你看,但是提供了很多的接口,而對于linux,雖然核心讓你看,可以由于沒有提供一個接口,是以你即使加載核心子產品也不能輕易實作某些事情,你需要做更多的事情,比如搜尋核心記憶體,然後修改之,能做這件事的人一定是高手了,而能寫一個驅動載入windows的人卻不一定是,這一點上和寫使用者空間應用程式沒有什麼差別,都是照着api文檔程式設計罷了,編譯器不同,api不同罷了,這一點上,誰更安全呢?

windows的分層核心子產品模型更像是在堆積木,而linux中寫死的代碼更像是一體式的架構結構。

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1273451

繼續閱讀