2012-11-15 27 views
10

第1部分:在哪裏執行設備驅動程序代碼?內核空間還是用戶空間?

到linux/unix專家那裏,請你幫我理解設備驅動程序。據我所知,驅動程序是一段代碼,直接與硬件交互,並暴露一些apis訪問設備。我的問題是這段代碼在哪裏運行,用戶空間還是內核空間?

我知道在內核空間中執行的代碼有一些額外的特權,如訪問任何內存位置(如果我錯了,請更正)。如果我們安裝第三方驅動程序,並且它在內核空間運行,這對整個系統是否有害?任何操作系統如何處理?

第2部分:

讓我們的USB設備的一個例子(攝像頭,鍵盤..),系統如何識別這些設備?系統如何知道要安裝哪個驅動程序?驅動程序如何知道設備的地址以讀取和寫入數據?

(如果這是太大了,這裏回答,請提供一些好的文檔或教程鏈接..,我試過,但沒有找到這些答案。請幫助)

+0

你應該把這個問題分成兩個單獨的問題。 – SomeWittyUsername

+1

在我的Linux設備驅動程序開發的舊日子裏,設備驅動程序在內核中編譯並執行100%的內核空間。如今內核似乎保護自己免受多餘的設備驅動程序攻擊,甚至中斷它們。但是如果這是一個關於學術考試的問題,我會以「核心空間」作爲答案。 –

+0

關於USB設備檢測,VID和PID用於識別設備。 –

回答

16

第1部分

在Linux上,驅動程序在內核空間中運行。是的,因爲你在這裏指出了一個重要的安全隱患。驅動程序中的大多數異常都會取消內核,可能會損壞內核內存(帶有各種後果)。 Buggy驅動程序也會對系統安全性產生影響,惡意驅動程序可以完成他們想要的任何事情。

在MacOSX和Window NT內核上出現的趨勢是用戶空間驅動程序。一段時間以來,微軟一直在推動Windows Userspace Driver Framework,而MacOSX長期以來爲Firewire和USB驅動程序提供用戶空間API,併爲許多USB外設提供符合類的驅動程序。在MacOSX上安裝第三方內核模式設備驅動程序是非常不尋常的。

可以說,曾經有內核恐慌壞名聲Windows可以歸因於(通常質量較差)內核模式,與幾乎所有的手機,相機和打印機驅動程序來。

Linux圖形驅動程序幾乎全部在用戶空間中實現,只有最小的內核駐留部分,並且Fuse允許在用戶空間中實現文件系統。

第2部分

USB,火線,MCI(以及PCI-E)都具有通過其總線驅動器可以在設備匹配到驅動器列舉的機制。實際上,這意味着所有設備都會公開描述它們的元數據。

元數據內包含一個的DeviceID,廠商ID和裝置提供的功能和相關聯的ClassID的描述。 ClassID促進通用Class Drivers

在概念上,操作系統將嘗試找到特異性支持廠商ID和一個的DeviceID驅動程序,然後回落到一個支持的ClassID(多個)。

匹配設備到驅動程序是Linux Device Model的核心概念,用於匹配的精確匹配條件是在特定總線驅動程序中的match()函數。

一旦設備驅動程序綁定到一個設備,它使用總線驅動程序(或它提供的地址信息)來執行讀取和寫入。在PCI和Firewire的情況下,這是一個內存映射IO地址。對於USB總線尋址信息。

Linux Documentation tree提供了一些有關Linux設備模型設計的信息,但不是真正的入門級閱讀。

我也推薦閱讀Linux Device Driver (3rd Edition)

相關問題