將驅動程序運行在ring1層上會提升系統本身的穩定性嗎?

眾所周知NT內核在開發的時候只利用了ring0和ring3,其中前者是內核模式,運行著操作系統本體和其它設備驅動,後者是用戶模式,運行著眾多應用程序。有時廠商提供的驅動有問題,由於它們是運行在內核模式下,由於系統的自我保護機制,內核模式下的錯誤會導致藍屏,終止整個系統的運行。當時Windows只支持ring0和ring3是因為除了支持x86架構,Windows還需要運行在MIPS、ARM等多種架構上,而部分架構只提供了兩個ring。儘管Intel CPU提供ring0、ring1、ring2和ring3,但Windows實際上只利用了其中兩個。

那麼問題來了,如果利用ring1和ring2,勢必會增加系統的複雜度,使系統安全問題更為複雜,但這樣做會對系統穩定性有幫助嗎?能解決和不能解決的問題有哪些?


沒用的。很多驅動之所以需要在ring 0,就是因為它需要用到ring 0的東西。而xp後期引入了user mode driver和kernel mode driver的劃分。大部分不需要ring 0的,放在umd里,通過escape去跟kmd通信。有了這個架構之後,kmd變得很小,整個驅動也可以變穩定很多。

如果強制要求ring 1,就會變成需要ring 3 driver、ring 1 driver和ring0 driver。任何一個都少不了,而且任何兩者之間都要能通訊。那何必呢。


其實很多事情放到用戶態也能做,比如最早窗口管理也是在用戶態的,但是太慢了,後來就搬到win32k了。你看現在http都進kernel了。

這個本來就是trade off,多用個ring本質上沒啥區別,反而更複雜了。


4個Ring的區分只是Intel在指令集級別實現的,並沒有強制規定各自的作用。而大部分常用OS因為都只有內核態和用戶態兩種級別所以只用Ring0/3,這也是順其自然的。當然非要用起來其它的Ring也是可以,可能會帶來穩定性的好處,但是這種最底層設計的更改,不光是增加複雜度的問題了,我個人感覺基本上所有模塊都要重新寫過來適配,那還不如從頭做一個操作系統好了。如果帶來的唯一好處僅僅是可能增強穩定性,那真不如不改。

另外,OS/2似乎是曾經用過Ring1還是2做I/O。現在的虛擬化軟體也多多少少利用了額外的Ring來隔離Guest OS。估計當這些用法穩定且成熟地被主流OS使用,這閑置的兩個Ring才會真正有它們的標準用處。用於新增的功能不會有歷史壓力,也容易在被廣泛接受後形成新的標準。這才是好用法,比回鍋現有的東西要現實但有用得多。


有個類似的想法已經有人實現了,可以去看一下SOSP 2013的一篇文章「 VirtuOS: An Operating System with Kernel Virtualization 」,介紹的就是一種把驅動和kernel解耦,利用xen hypervisor將各個os模塊放到一個獨立的vm guest中,這樣整個系統就把Ring 0 1 2 3都盤活了。文章的出發點就是通過分離驅動來提高系統穩定性。

不過和樓主說的相反,雖然這個架構看起來把os整體(kernel+driver)搞複雜了,但從kernel本身來講反而是降低了複雜度並提升了安全性:

  1. Kernel地址空間和驅動模塊隔離,驅動代碼的崩潰不會直接污染整個系統
  2. 把驅動拿出去,整個Kernel本身便可以非常精簡,降低了Kernel的複雜度

最後回到樓主的問題,只要能把驅動和內核解耦開,是可以一定程度提升整體穩定性的

==================================

扯個比較遠的,從這個角度來看微內核能擁有比宏內核更高的穩定性


構造越複雜,崩潰的幾率反而越大


推薦閱讀:

操作系統內核具體實現中比較巧妙的思想有哪些?
從程序員的角度看,Windows 有哪些先進的地方?
windows 32位 為什麼實際可用最大內存只有3G?
進程和線程之間有什麼根本性的區別,我總感覺線程是進程的進化版?求解答
Linux中進程具有父子層次結構,Windows中沒有進程層次,這兩種設計各有什麼優劣?

TAG:MicrosoftWindows | 驅動程序 | 底層開發 | 操作系統內核 |