自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux與Windows的設(shè)備驅(qū)動模型對比:架構(gòu)、API 和開發(fā)環(huán)境比較

系統(tǒng) Linux Windows
設(shè)備驅(qū)動是操作系統(tǒng)的一部分,它能夠通過一些特定的編程接口便于硬件設(shè)備的使用,這樣軟件就可以控制并且運行那些設(shè)備了。在本文中,我們將比較 Windows 和 Linux 設(shè)備驅(qū)動程序,探索不同的架構(gòu),API,構(gòu)建開發(fā)和分發(fā),希望讓您比較深入的理解如何開始為每一個操作系統(tǒng)編寫設(shè)備驅(qū)動程序。

[[176008]]

名詞縮寫:

API 應用程序接口(Application Program Interface )

ABI 應用系統(tǒng)二進制接口(Application Binary Interface)

設(shè)備驅(qū)動是操作系統(tǒng)的一部分,它能夠通過一些特定的編程接口便于硬件設(shè)備的使用,這樣軟件就可以控制并且運行那些設(shè)備了。因為每個驅(qū)動都對應不同的操作系統(tǒng),所以你就需要不同的 Linux、Windows 或 Unix 設(shè)備驅(qū)動,以便能夠在不同的計算機上使用你的設(shè)備。這就是為什么當你雇傭一個驅(qū)動開發(fā)者或者選擇一個研發(fā)服務商提供者的時候,查看他們?yōu)楦鞣N操作系統(tǒng)平臺開發(fā)驅(qū)動的經(jīng)驗是非常重要的。 

 

 

 

驅(qū)動開發(fā)的***步是理解每個操作系統(tǒng)處理它的驅(qū)動的不同方式、底層驅(qū)動模型、它使用的架構(gòu)、以及可用的開發(fā)工具。例如,Linux 驅(qū)動程序模型就與 Windows 非常不同。雖然 Windows 提倡驅(qū)動程序開發(fā)和操作系統(tǒng)開發(fā)分別進行,并通過一組 ABI 調(diào)用來結(jié)合驅(qū)動程序和操作系統(tǒng),但是 Linux 設(shè)備驅(qū)動程序開發(fā)不依賴任何穩(wěn)定的 ABI 或 API,所以它的驅(qū)動代碼并沒有被納入內(nèi)核中。每一種模型都有自己的優(yōu)點和缺點,但是如果你想為你的設(shè)備提供全面支持,那么重要的是要全面的了解它們。

在本文中,我們將比較 Windows 和 Linux 設(shè)備驅(qū)動程序,探索不同的架構(gòu),API,構(gòu)建開發(fā)和分發(fā),希望讓您比較深入的理解如何開始為每一個操作系統(tǒng)編寫設(shè)備驅(qū)動程序。

1. 設(shè)備驅(qū)動架構(gòu)

Windows 設(shè)備驅(qū)動程序的體系結(jié)構(gòu)和 Linux 中使用的不同,它們各有優(yōu)缺點。差異主要受以下原因的影響:Windows 是閉源操作系統(tǒng),而 Linux 是開源操作系統(tǒng)。比較 Linux 和 Windows 設(shè)備驅(qū)動程序架構(gòu)將幫助我們理解 Windows 和 Linux 驅(qū)動程序背后的核心差異。

1.1. Windows 驅(qū)動架構(gòu)

雖然 Linux 內(nèi)核分發(fā)時帶著 Linux 驅(qū)動,而 Windows 內(nèi)核則不包括設(shè)備驅(qū)動程序。與之不同的是,現(xiàn)代 Windows 設(shè)備驅(qū)動程序編寫使用 Windows 驅(qū)動模型(WDM),這是一種完全支持即插即用和電源管理的模型,所以可以根據(jù)需要加載和卸載驅(qū)動程序。

處理來自應用的請求,是由 Windows 內(nèi)核的中被稱為 I/O 管理器的部分來完成的。I/O 管理器的作用是是轉(zhuǎn)換這些請求到 I/O 請求數(shù)據(jù)包(IO Request Packets)(IRP),IRP 可以被用來在驅(qū)動層識別請求并且傳輸數(shù)據(jù)。

Windows 驅(qū)動模型 WDM 提供三種驅(qū)動, 它們形成了三個層:

  • 過濾(Filter)驅(qū)動提供關(guān)于 IRP 的可選附加處理。
  • 功能(Function)驅(qū)動是實現(xiàn)接口和每個設(shè)備通信的主要驅(qū)動。
  • 總線(Bus)驅(qū)動服務不同的配適器和不同的總線控制器,來實現(xiàn)主機模式控制設(shè)備。

一個 IRP 通過這些層就像它們經(jīng)過 I/O 管理器到達底層硬件那樣。每個層能夠獨立的處理一個 IRP 并且把它們送回 I/O 管理器。在硬件底層中有硬件抽象層(HAL),它提供一個通用的接口到物理設(shè)備。

1.2. Linux 驅(qū)動架構(gòu)

相比于 Windows 設(shè)備驅(qū)動,Linux 設(shè)備驅(qū)動架構(gòu)根本性的不同就是 Linux 沒有一個標準的驅(qū)動模型也沒有一個干凈分隔的層。每一個設(shè)備驅(qū)動都被當做一個能夠自動的從內(nèi)核中加載和卸載的模塊來實現(xiàn)。Linux 為即插即用設(shè)備和電源管理設(shè)備提供一些方式,以便那些驅(qū)動可以使用它們來正確地管理這些設(shè)備,但這并不是必須的。

模式輸出那些它們提供的函數(shù),并通過調(diào)用這些函數(shù)和傳入隨意定義的數(shù)據(jù)結(jié)構(gòu)來溝通。請求來自文件系統(tǒng)或網(wǎng)絡(luò)層的用戶應用,并被轉(zhuǎn)化為需要的數(shù)據(jù)結(jié)構(gòu)。模塊能夠按層堆疊,在一個模塊進行處理之后,另外一個再處理,有些模塊提供了對一類設(shè)備的公共調(diào)用接口,例如 USB 設(shè)備。

Linux 設(shè)備驅(qū)動程序支持三種設(shè)備:

  • 實現(xiàn)一個字節(jié)流接口的字符(Character)設(shè)備。
  • 用于存放文件系統(tǒng)和處理多字節(jié)數(shù)據(jù)塊 IO 的塊(Block)設(shè)備。
  • 用于通過網(wǎng)絡(luò)傳輸數(shù)據(jù)包的網(wǎng)絡(luò)(Network)接口。

Linux 也有一個硬件抽象層(HAL),它實際扮演了物理硬件的設(shè)備驅(qū)動接口。

2. 設(shè)備驅(qū)動 API

Linux 和 Windows 驅(qū)動 API 都屬于事件驅(qū)動類型:只有當某些事件發(fā)生的時候,驅(qū)動代碼才執(zhí)行——當用戶的應用程序希望從設(shè)備獲取一些東西,或者當設(shè)備有某些請求需要告知操作系統(tǒng)。

2.1. 初始化

在 Windows 上,驅(qū)動被表示為 DriverObject 結(jié)構(gòu),它在 DriverEntry 函數(shù)的執(zhí)行過程中被初始化。這些入口點也注冊一些回調(diào)函數(shù),用來響應設(shè)備的添加和移除、驅(qū)動卸載和處理新進入的 IRP。當一個設(shè)備連接的時候,Windows 創(chuàng)建一個設(shè)備對象,這個設(shè)備對象在設(shè)備驅(qū)動后面處理所有應用請求。

相比于 Windows,Linux 設(shè)備驅(qū)動生命周期由內(nèi)核模塊的 module_init 和 module_exit 函數(shù)負責管理,它們分別用于模塊的加載和卸載。它們負責注冊模塊來通過使用內(nèi)核接口來處理設(shè)備的請求。這個模塊需要創(chuàng)建一個設(shè)備文件(或者一個網(wǎng)絡(luò)接口),為其所希望管理的設(shè)備指定一個數(shù)字識別號,并注冊一些當用戶與設(shè)備文件交互的時候所使用的回調(diào)函數(shù)。

2.2. 命名和聲明設(shè)備

在 Windows 上注冊設(shè)備

Windows 設(shè)備驅(qū)動在新連接設(shè)備時是由回調(diào)函數(shù) AddDevice 通知的。它接下來就去創(chuàng)建一個設(shè)備對象(device object),用于識別該設(shè)備的特定的驅(qū)動實例。取決于驅(qū)動的類型,設(shè)備對象可以是物理設(shè)備對象(Physical Device Object)(PDO),功能設(shè)備對象(Function Device Object)(FDO),或者過濾設(shè)備對象(Filter Device Object )(FIDO)。設(shè)備對象能夠堆疊,PDO 在底層。

設(shè)備對象在這個設(shè)備連接在計算機期間一直存在。DeviceExtension 結(jié)構(gòu)能夠被用于關(guān)聯(lián)到一個設(shè)備對象的全局數(shù)據(jù)。

設(shè)備對象可以有如下形式的名字 \Device\DeviceName,這被系統(tǒng)用來識別和定位它們。應用可以使用 CreateFile API 函數(shù)來打開一個有上述名字的文件,獲得一個可以用于和設(shè)備交互的句柄。

然而,通常只有 PDO 有自己的名字。未命名的設(shè)備能夠通過設(shè)備級接口來訪問。設(shè)備驅(qū)動注冊一個或多個接口,以 128 位全局唯一標識符(GUID)來標示它們。用戶應用能夠使用已知的 GUID 來獲取一個設(shè)備的句柄。

在 Linux 上注冊設(shè)備

在 Linux 平臺上,用戶應用通過文件系統(tǒng)入口訪問設(shè)備,它通常位于 /dev 目錄。在模塊初始化的時候,它通過調(diào)用內(nèi)核函數(shù) register_chrdev 創(chuàng)建了所有需要的入口。應用可以發(fā)起 open 系統(tǒng)調(diào)用來獲取一個文件描述符來與設(shè)備進行交互。這個調(diào)用后來被發(fā)送到回調(diào)函數(shù),這個調(diào)用(以及將來對該返回的文件描述符的進一步調(diào)用,例如 read、write 或close)會被分配到由該模塊安裝到 file_operations 或者 block_device_operations這樣的數(shù)據(jù)結(jié)構(gòu)中的回調(diào)函數(shù)。

設(shè)備驅(qū)動模塊負責分配和保持任何需要用于操作的數(shù)據(jù)結(jié)構(gòu)。傳送進文件系統(tǒng)回調(diào)函數(shù)的 file 結(jié)構(gòu)有一個 private_data 字段,它可以被用來存放指向具體驅(qū)動數(shù)據(jù)的指針。塊設(shè)備和網(wǎng)絡(luò)接口 API 也提供類似的字段。

雖然應用使用文件系統(tǒng)的節(jié)點來定位設(shè)備,但是 Linux 在內(nèi)部使用一個主設(shè)備號(major numbers)和次設(shè)備號(minor numbers)的概念來識別設(shè)備及其驅(qū)動。主設(shè)備號被用來識別設(shè)備驅(qū)動,而次設(shè)備號由驅(qū)動使用來識別它所管理的設(shè)備。驅(qū)動為了去管理一個或多個固定的主設(shè)備號,必須首先注冊自己或者讓系統(tǒng)來分配未使用的設(shè)備號給它。

目前,Linux 為主次設(shè)備對(major-minor pairs)使用一個 32 位的值,其中 12 位分配主設(shè)備號,并允許多達 4096 個不同的設(shè)備。主次設(shè)備對對于字符設(shè)備和塊設(shè)備是不同的,所以一個字符設(shè)備和一個塊設(shè)備能使用相同的設(shè)備對而不導致沖突。網(wǎng)絡(luò)接口是通過像 eth0 的符號名來識別,這些又是區(qū)別于主次設(shè)備的字符設(shè)備和塊設(shè)備的。

2.3. 交換數(shù)據(jù)

Linux 和 Windows 都支持在用戶級應用程序和內(nèi)核級驅(qū)動程序之間傳輸數(shù)據(jù)的三種方式:

  • 緩沖型輸入輸出(Buffered Input-Output)它使用由內(nèi)核管理的緩沖區(qū)。對于寫操作,內(nèi)核從用戶空間緩沖區(qū)中拷貝數(shù)據(jù)到內(nèi)核分配的緩沖區(qū),并且把它傳送到設(shè)備驅(qū)動中。讀操作也一樣,由內(nèi)核將數(shù)據(jù)從內(nèi)核緩沖區(qū)中拷貝到應用提供的緩沖區(qū)中。
  • 直接型輸入輸出(Direct Input-Output) 它不使用拷貝功能。代替它的是,內(nèi)核在物理內(nèi)存中釘死一塊用戶分配的緩沖區(qū)以便它可以一直留在那里,以便在數(shù)據(jù)傳輸過程中不被交換出去。
  • 內(nèi)存映射(Memory mapping) 它也能夠由內(nèi)核管理,這樣內(nèi)核和用戶空間應用就能夠通過不同的地址訪問同樣的內(nèi)存頁。

Windows 上的驅(qū)動程序 I/O 模式

支持緩沖型 I/O 是 WDM 的內(nèi)置功能。緩沖區(qū)能夠被設(shè)備驅(qū)動通過在 IRP 結(jié)構(gòu)中的 AssociatedIrp.SystemBuffer 字段訪問。當需要和用戶空間通訊的時候,驅(qū)動只需從這個緩沖區(qū)中進行讀寫操作。

Windows 上的直接 I/O 由內(nèi)存描述符列表(memory descriptor lists)(MDL)介導。這種半透明的結(jié)構(gòu)是通過在 IRP 中的 MdlAddress 字段來訪問的。它們被用來定位由用戶應用程序分配的緩沖區(qū)的物理地址,并在 I/O 請求期間釘死不動。

在 Windows 上進行數(shù)據(jù)傳輸?shù)牡谌齻€選項稱為 METHOD_NEITHER。 在這種情況下,內(nèi)核需要傳送用戶空間的輸入輸出緩沖區(qū)的虛擬地址給驅(qū)動,而不需要確定它們有效或者保證它們映射到一個可以由設(shè)備驅(qū)動訪問的物理內(nèi)存地址。設(shè)備驅(qū)動負責處理這些數(shù)據(jù)傳輸?shù)募毠?jié)。

Linux 上的驅(qū)動程序 I/O 模式

Linux 提供許多函數(shù)例如,clear_user、copy_to_user、strncpy_from_user 和一些其它的用來在內(nèi)核和用戶內(nèi)存之間進行緩沖區(qū)數(shù)據(jù)傳輸?shù)暮瘮?shù)。這些函數(shù)保證了指向數(shù)據(jù)緩存區(qū)指針的有效,并且通過在內(nèi)存區(qū)域之間安全地拷貝數(shù)據(jù)緩沖區(qū)來處理數(shù)據(jù)傳輸?shù)乃屑毠?jié)。

然而,塊設(shè)備的驅(qū)動對已知大小的整個數(shù)據(jù)塊進行操作,它可以在內(nèi)核和用戶地址區(qū)域之間被快速移動而不需要拷貝它們。這種情況是由 Linux 內(nèi)核來自動處理所有的塊設(shè)備驅(qū)動。塊請求隊列處理傳送數(shù)據(jù)塊而不用多余的拷貝,而 Linux 系統(tǒng)調(diào)用接口來轉(zhuǎn)換文件系統(tǒng)請求到塊請求中。

最終,設(shè)備驅(qū)動能夠從內(nèi)核地址區(qū)域分配一些存儲頁面(不可交換的)并且使用 remap_pfn_range 函數(shù)來直接映射這些頁面到用戶進程的地址空間。然后應用能獲取這些緩沖區(qū)的虛擬地址并且使用它來和設(shè)備驅(qū)動交流。

3. 設(shè)備驅(qū)動開發(fā)環(huán)境

3.1. 設(shè)備驅(qū)動框架

Windows 驅(qū)動程序工具包

Windows 是一個閉源操作系統(tǒng)。Microsoft 提供 Windows 驅(qū)動程序工具包以方便非 Microsoft 供應商開發(fā) Windows 設(shè)備驅(qū)動。工具包中包含開發(fā)、調(diào)試、檢驗和打包 Windows 設(shè)備驅(qū)動等所需的所有內(nèi)容。

Windows 驅(qū)動模型(Windows Driver Model)(WDM)為設(shè)備驅(qū)動定義了一個干凈的接口框架。Windows 保持這些接口的源代碼和二進制的兼容性。編譯好的 WDM 驅(qū)動通常是前向兼容性:也就是說,一個較舊的驅(qū)動能夠在沒有重新編譯的情況下在較新的系統(tǒng)上運行,但是它當然不能夠訪問系統(tǒng)提供的新功能。但是,驅(qū)動不保證后向兼容性。

Linux 源代碼

和 Windows 相對比,Linux 是一個開源操作系統(tǒng),因此 Linux 的整個源代碼是用于驅(qū)動開發(fā)的 SDK。沒有驅(qū)動設(shè)備的正式框架,但是 Linux 內(nèi)核包含許多提供了如驅(qū)動注冊這樣的通用服務的子系統(tǒng)。這些子系統(tǒng)的接口在內(nèi)核頭文件中描述。

盡管 Linux 有定義接口,但這些接口在設(shè)計上并不穩(wěn)定。Linux 不提供有關(guān)前向和后向兼容的任何保證。設(shè)備驅(qū)動對于不同的內(nèi)核版本需要重新編譯。沒有穩(wěn)定性的保證可以讓 Linux 內(nèi)核進行快速開發(fā),因為開發(fā)人員不必去支持舊的接口,并且能夠使用***的方法解決手頭的這些問題。

當為 Linux 寫樹內(nèi)(in-tree)(指當前 Linux 內(nèi)核開發(fā)主干)驅(qū)動程序時,這種不斷變化的環(huán)境不會造成任何問題,因為它們作為內(nèi)核源代碼的一部分,與內(nèi)核本身同步更新。然而,閉源驅(qū)動必須單獨開發(fā),并且在樹外(out-of-tree),必須維護它們以支持不同的內(nèi)核版本。因此,Linux 鼓勵設(shè)備驅(qū)動程序開發(fā)人員在樹內(nèi)維護他們的驅(qū)動。

3.2. 為設(shè)備驅(qū)動構(gòu)建系統(tǒng)

Windows 驅(qū)動程序工具包為 Microsoft Visual Studio 添加了驅(qū)動開發(fā)支持,并包括用來構(gòu)建驅(qū)動程序代碼的編譯器。開發(fā) Windows 設(shè)備驅(qū)動程序與在 IDE 中開發(fā)用戶空間應用程序沒有太大的區(qū)別。Microsoft 提供了一個企業(yè) Windows 驅(qū)動程序工具包,提供了類似于 Linux 命令行的構(gòu)建環(huán)境。

Linux 使用 Makefile 作為樹內(nèi)和樹外系統(tǒng)設(shè)備驅(qū)動程序的構(gòu)建系統(tǒng)。Linux 構(gòu)建系統(tǒng)非常發(fā)達,通常是一個設(shè)備驅(qū)動程序只需要少數(shù)行就產(chǎn)生一個可工作的二進制代碼。開發(fā)人員可以使用任何 IDE,只要它可以處理 Linux 源代碼庫和運行 make ,他們也可以很容易地從終端手動編譯驅(qū)動程序。

3.3. 文檔支持

Windows 對于驅(qū)動程序的開發(fā)有良好的文檔支持。Windows 驅(qū)動程序工具包包括文檔和示例驅(qū)動程序代碼,通過 MSDN 可獲得關(guān)于內(nèi)核接口的大量信息,并存在大量的有關(guān)驅(qū)動程序開發(fā)和 Windows 底層的參考和指南。

Linux 文檔不是描述性的,但整個 Linux 源代碼可供驅(qū)動開發(fā)人員使用緩解了這一問題。源代碼樹中的 Documentation 目錄描述了一些 Linux 的子系統(tǒng),但是有幾本書介紹了關(guān)于 Linux 設(shè)備驅(qū)動程序開發(fā)和 Linux 內(nèi)核概覽,它們更詳細。

Linux 沒有提供設(shè)備驅(qū)動程序的指定樣本,但現(xiàn)有生產(chǎn)級驅(qū)動程序的源代碼可用,可以用作開發(fā)新設(shè)備驅(qū)動程序的參考。

3.4. 調(diào)試支持

Linux 和 Windows 都有可用于追蹤調(diào)試驅(qū)動程序代碼的日志機制。在 Windows 上將使用 DbgPrint 函數(shù),而在 Linux 上使用的函數(shù)稱為 printk。然而,并不是每個問題都可以通過只使用日志記錄和源代碼來解決。有時斷點更有用,因為它們允許檢查驅(qū)動代碼的動態(tài)行為。交互式調(diào)試對于研究崩潰的原因也是必不可少的。

Windows 通過其內(nèi)核級調(diào)試器 WinDbg 支持交互式調(diào)試。這需要通過一個串行端口連接兩臺機器:一臺計算機運行被調(diào)試的內(nèi)核,另一臺運行調(diào)試器和控制被調(diào)試的操作系統(tǒng)。Windows 驅(qū)動程序工具包包括 Windows 內(nèi)核的調(diào)試符號,因此 Windows 的數(shù)據(jù)結(jié)構(gòu)將在調(diào)試器中部分可見。

Linux 還支持通過 KDB 和 KGDB 進行的交互式調(diào)試。調(diào)試支持可以內(nèi)置到內(nèi)核,并可在啟動時啟用。之后,可以直接通過物理鍵盤調(diào)試系統(tǒng),或通過串行端口從另一臺計算機連接到它。KDB 提供了一個簡單的命令行界面,這是唯一的在同一臺機器上來調(diào)試內(nèi)核的方法。然而,KDB 缺乏源代碼級調(diào)試支持。KGDB 通過串行端口提供了一個更復雜的接口。它允許使用像 GDB 這樣標準的應用程序調(diào)試器來調(diào)試 Linux 內(nèi)核,就像任何其它用戶空間應用程序一樣。

4. 設(shè)備驅(qū)動分發(fā)

4.1. 安裝設(shè)備驅(qū)動

在 Windows 上安裝的驅(qū)動程序,是由被稱為為 INF 的文本文件描述的,通常存儲在 C:\Windows\INF 目錄中。這些文件由驅(qū)動供應商提供,并且定義哪些設(shè)備由該驅(qū)動程序服務,哪里可以找到驅(qū)動程序的二進制文件,和驅(qū)動程序的版本等。

當一個新設(shè)備插入計算機時,Windows 通過查看已經(jīng)安裝的驅(qū)動程序并且選擇適當?shù)囊粋€加載。當設(shè)備被移除的時候,驅(qū)動會自動卸載它。

在 Linux 上,一些驅(qū)動被構(gòu)建到內(nèi)核中并且保持***的加載。非必要的驅(qū)動被構(gòu)建為內(nèi)核模塊,它們通常是存儲在 /lib/modules/kernel-version 目錄中。這個目錄還包含各種配置文件,如 modules.dep,用于描述內(nèi)核模塊之間的依賴關(guān)系。

雖然 Linux 內(nèi)核可以在自身啟動時加載一些模塊,但通常模塊加載由用戶空間應用程序監(jiān)督。例如,init 進程可能在系統(tǒng)初始化期間加載一些模塊,udev 守護程序負責跟蹤新插入的設(shè)備并為它們加載適當?shù)哪K。

4.2. 更新設(shè)備驅(qū)動

Windows 為設(shè)備驅(qū)動程序提供了穩(wěn)定的二進制接口,因此在某些情況下,無需與系統(tǒng)一起更新驅(qū)動程序二進制文件。任何必要的更新由 Windows Update 服務處理,它負責定位、下載和安裝適用于系統(tǒng)的***版本的驅(qū)動程序。

然而,Linux 不提供穩(wěn)定的二進制接口,因此有必要在每次內(nèi)核更新時重新編譯和更新所有必需的設(shè)備驅(qū)動程序。顯然,內(nèi)置在內(nèi)核中的設(shè)備驅(qū)動程序會自動更新,但是樹外模塊會產(chǎn)生輕微的問題。 維護***的模塊二進制文件的任務通常用 DKMS 來解決:這是一個當安裝新的內(nèi)核版本時自動重建所有注冊的內(nèi)核模塊的服務。

4.3. 安全方面的考慮

所有 Windows 設(shè)備驅(qū)動程序在 Windows 加載它們之前必須被數(shù)字簽名。在開發(fā)期間可以使用自簽名證書,但是分發(fā)給終端用戶的驅(qū)動程序包必須使用 Microsoft 信任的有效證書進行簽名。供應商可以從 Microsoft 授權(quán)的任何受信任的證書頒發(fā)機構(gòu)獲取軟件出版商證書(Software Publisher Certificate)。然后,此證書由 Microsoft 交叉簽名,并且生成的交叉證書用于在發(fā)行之前簽署驅(qū)動程序包。

Linux 內(nèi)核也能配置為在內(nèi)核模塊被加載前校驗簽名,并禁止不可信的內(nèi)核模塊。被內(nèi)核所信任的公鑰集在構(gòu)建時是固定的,并且是完全可配置的。由內(nèi)核執(zhí)行的檢查,這個檢查嚴格性在構(gòu)建時也是可配置的,范圍從簡單地為不可信模塊發(fā)出警告,到拒絕加載有效性可疑的任何東西。

5. 結(jié)論

如上所示,Windows 和 Linux 設(shè)備驅(qū)動程序基礎(chǔ)設(shè)施有一些共同點,例如調(diào)用 API 的方法,但更多的細節(jié)是相當不同的。最突出的差異源于 Windows 是由商業(yè)公司開發(fā)的封閉源操作系統(tǒng)這個事實。這使得 Windows 上有好的、文檔化的、穩(wěn)定的驅(qū)動 ABI 和正式框架,而在 Linux 上,更多的是源代碼做了一個有益的補充。文檔支持也在 Windows 環(huán)境中更加發(fā)達,因為 Microsoft 具有維護它所需的資源。

另一方面,Linux 不會使用框架來限制設(shè)備驅(qū)動程序開發(fā)人員,并且內(nèi)核和產(chǎn)品級設(shè)備驅(qū)動程序的源代碼可以在需要的時候有所幫助。缺乏接口穩(wěn)定性也有其作用,因為它意味著***的設(shè)備驅(qū)動程序總是使用***的接口,內(nèi)核本身承載較小的后向兼容性負擔,這帶來了更干凈的代碼。

了解這些差異以及每個系統(tǒng)的具體情況是為您的設(shè)備提供有效的驅(qū)動程序開發(fā)和支持的關(guān)鍵的***步。我們希望這篇文章對 Windows 和 Linux 設(shè)備驅(qū)動程序開發(fā)做的對比,有助于您理解它們,并在設(shè)備驅(qū)動程序開發(fā)過程的研究中,將此作為一個偉大的起點。

責任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2017-11-16 14:46:58

Linuxplatform總線驅(qū)動設(shè)備

2020-12-03 08:59:06

Linux設(shè)備驅(qū)動

2013-07-29 14:23:55

Eclipse開發(fā)環(huán)境Eclipse開發(fā)環(huán)境

2010-05-28 13:38:29

Linux開發(fā)工具

2009-11-03 08:53:42

LinuxWindows環(huán)境變量

2009-12-31 08:49:15

模型驅(qū)動開發(fā)

2016-12-15 14:55:31

Linux定時延時

2011-01-07 16:49:13

LinuxWindows

2021-04-12 12:00:13

Linux運維Linux系統(tǒng)

2009-08-10 09:26:56

2009-12-07 09:39:04

Linux設(shè)備驅(qū)動硬件通信

2020-09-03 11:39:57

WindowsLinux服務器

2018-05-04 14:34:06

微服務SOAAPI

2017-11-07 20:12:05

Linux音頻設(shè)備ALSA

2023-12-05 15:18:27

事件驅(qū)動架構(gòu)RESTful通信模式

2010-07-19 10:05:52

ibmdwLinux

2011-08-19 09:21:42

2017-02-10 15:32:47

2011-11-04 11:27:19

2009-07-03 12:05:14

點贊
收藏

51CTO技術(shù)棧公眾號