驅動程序是不是進程?


驅動程序分很多種,不同操作系統的驅動程序定義都不太一樣,所以你這個問題問的就有歧義。

以下討論主要限於x86和x64的環境

進程通常指一個地址空間下的一個或者多個線程的集合;

驅動通常指為硬體/操作系統提供支持和某些服務的代碼。

如果按照這個定義:

大部分Windows內核驅動都不算進程,只能算內核線程,但有些驅動可以工作在內核進程地址空間上,也可以工作在任務進程地址空間上,所以這個問題不好歸類。

少數Windows驅動可以工作在用戶態,以進程方式工作,這種驅動屬於進程,但似乎很少,只看到SDK上有說過,沒有見過實例。(也有一說:Windows的服務屬於進程,但服務本身算不算驅動還另說)

Linux通常也是以內核線程的方式工作的,過去Linux使用中斷進行系統調用切換,這種模型下,內核線程驅動不屬於進程,但現在Linux在也用enter/leave的方式了,所以算不算切換地址空間也很難說,

在大多數嵌入式系統平台,一般都沒有進程切換的概念,所以所有驅動都屬於線程,或者連線程都算不上。在支持進程空間切換的嵌入式平台,請參考Linux的例子。

總結下來:有一些驅動屬於線程,極少數驅動屬於進程,另有一些驅動只是提供一些調用的介面,運行在哪個地址空間上取決於調用者。


linux 下寫設備驅動,會要求注意當前代碼是處在中斷上下文,還是進程上下文。

進程上下文里的驅動代碼何時被執行,是由用戶進程或內核線程調用決定的。進程和內核線程是由調度器來管理的。

中斷上下文里的程序,只會在中斷產生時執行。中斷上下文不允許調用會導致睡眠的函數,因為睡眠就會主動放棄當前cpu控制權,由調度器選一個進程恢復上下文後繼續執行。調度器只能恢復進程上下文,不能恢復中斷上下文。

你可以簡單認為一個linux網卡驅動,一部分是進程,一部分不是進程。

能夠被進程調度器恢復執行的代碼,不被叫做進程,實在沒天理啊。


在windows平台下,驅動程序(.sys)和其他程序(.exe、.dll)都是一種常用的PE格式程序,他們都不是一個進程,供線程調用執行的。

.sys和.exe分處在進程地址空間不同的部分,一個在內核地址空間,一個在用戶地址空間。以x32平台為例,一般來說,用戶空間占虛擬地址的低2G位地址空間中,內核空間占高2G。每個進程的虛擬地址空間中,低2G是獨立的,高2G是共享的。

一個用戶線程有兩個棧,用戶空間棧和內核空間棧。線程執行用戶空間,既執行.exe的時候,會把線程上下文保存在用戶空間棧中,以此實現用戶空間代碼執行過程中的棧平衡。當從用戶模式切換到內核模式後,會使用線程的內核棧。此時執行的代碼會來自於各類.sys裡面的代碼。

簡單來說,.sys和.exe分處於進程虛擬空間的不同部分,都只是一種可執行文件格式,而不是進程,是供線程來執行的。


大多數主流操作系統不是,很多微內核操作系統,例如QNX,是。


推薦閱讀:

我一個朋友竟然告訴我計算機處理多進程是排隊處理,計算機無法同時處理多個進程。我應該怎麼說服他?
線程和進程的區別是什麼?
操作系統的系統開銷比率怎麼計算?
為什麼要了解進程與線程的區別,了解二者的區別有什麼意義呢?
安卓系統的通病後台啟動進程過多,待機狀態下就占內存一半,怎麼解決這種問題呢?

TAG:操作系統 | 驅動程序 | 進程 |