第一章
核心流縱覽
核心流kernel streaming(ks)驅動模型支援多**裝置,例如音效卡和電視調諧器卡。本章描述了核心流的一般的概念。
1.1
核心流概念概要
多**裝置可以支援多種多樣的技術。為了更好地支援這些裝置的更大的範圍,微軟引入了核心流驅動模型。支援核心流模型的驅動可以向作業系統報告它們的效能。編寫在核心流模型上面執行的客戶端可以確定它執行的平台的多**的效能。核心流是視窗驅動模型(wdm)的一部分。
ks驅動可以過濾器和功能驅動。作業系統可以裝載過濾器驅動來透明地擴充套件平台的多**效能。
1.1.1
核心流客戶端介面
核心流驅動提供給客戶端的介面由一組檔案物件組成。每個檔案物件表現了驅動的不同的效能。客戶端向檔案物件發出i/o和請求來控制驅動的不同方面。
核心流驅動的檔案物件有幾種不同的族:
l過濾器(filters)
ks過濾器封裝了裝置的功能單元。驅動可以支援同乙個過濾器的多個例項。多功能裝置的驅動可以支援幾種不同型別的ks過濾器。不要把ks過濾器和過濾器驅動搞混 - ks驅動的每一種型別,要麼功能要麼過濾器,都有它建立乙個或多個ks過濾器檔案物件。l
pins
pin表示了裝置上的乙個i/o途徑。客戶端可以連線到pins,然後連線pins到其它的pins。客戶端也可以向乙個pin查詢它支援的資料型別。l
時鐘(clocks)
支援主機板上的時鐘的驅動把時鐘作為乙個檔案物件暴露出來。客戶端可以查詢時鐘時間,也可以請求當時鐘到達某時間時被通知。l
分配器(allocators)
支援自定義記憶體管理介面的驅動,例如,裝置主機板記憶體的管理,把介面作為乙個檔案暴露出來。客戶端可以使用檔案物件來分配和釋放記憶體。
ks檔案物件是按層次組織起來的 - 客戶端用irp_mj_create來例項化驅動上的ks過濾器,然後輪流用irp_mj_create來例項化過濾器上的pins,時鐘和pins上的分配器。
核心流體系結構為驅動和客戶端的互動提供了乙個可擴充套件的機制。ks物件支援幾種不同的語義概念:l
屬性
ks物件支援屬性。客戶端可以詢問物件來確定它支援的屬性型別,然後它可以取得或者設定這些屬性。例如,音訊驅動pins可以支援允許客戶端取得或設定裝置音量的屬性。l
事件
ks物件可以定義它支援的非同步事件型別。客戶端可以查詢物件來確定它支援什麼事件,它們可以請求當乙個事件發生時被通知。例如,客戶端可以請求乙個時鐘物件,當時鐘到達特定時刻時就通知它。l
方法
像com物件一樣,ks物件可以支援方法。例如,分配器物件支援分配和釋放記憶體的方法。
微軟定義了屬性、事件和方法的標準集合。客戶端和驅動可以支援這些集合來共同支援多**的標準形式。驅動也可以支援自定義的屬性、事件和方法集合,特定裝置的客戶端可以用來和特定的裝置互動。客戶端通過一組irp_mj_device_control ioctl來和ks物件互動。客戶端在irp的io_stack_location的
deviceobject和
fileobject成員中指定驅動和核心流物件。
l ioctl_ks_read_stream
客戶端用來從乙個pin中讀取資料
l ioctl_ks_write_stream
客戶端用來向乙個pin中寫入資料
l ioctl_ks_property
客戶端用這ioctl取得或設定屬性,或者確定ks物件是否支援屬性
l ioctl_ks_enable_event
客戶端用這ioctl來請求事件型別通知,或者確定ks物件是否支援事件
l ioctl_ks_disable_event
客戶端用這ioctl來廢除先前的請求通知
l ioctl_ks_method
客戶端用這ioctl來執行ks物件上的方法
驅動不需要直接支援這些io請求。微軟提供類驅動來處理支援這些請求的錯綜複雜。更多細節見「核心流驅動實現」。
1.1.2
核心流驅動實現
為了易於核心流驅動的開發,微軟提供了兩個類驅動,來處理支援核心流語義的大部分工作:
音訊埠類驅動支援系統匯流排上的內建音效卡,例如isa或者pci。
每個類驅動提供乙個介面來支援核心流物件和它們的i/o請求。驅動提供了它們所支援的ks物件的描述,類驅動透明地處理檔案物件的建立和接收ioctl_ks_***請求。
音訊埠類驅動在「音訊微型埠驅動」文件。流類驅動在「流微型驅動設計指南」文件。
wdm音訊驅動設計指南
***驅動模型設計指南
1.2 ks
屬性、事件和方法
每個ks物件支援內部操作,允許客戶端取得和設定物件狀態,執行物件方法和為事件註冊通知**函式。驅動以標準的方式支援這些種類中的每個操作 - 屬性、方法和事件。l
集合(set)
相似功能的操作以集合組成在一起。每個屬性、事件或者方法集合用乙個guid標識。微軟為標準技術說明操作定義了guid。驅動可以為自定義操作定義它們自己的guid。l
識別符號(identifier)
在集合中每個操作用id數字來指定l
指定操作確認資料(operation-specific identification data)
特定的操作可能需要額外的資料來完全指定。例如,音訊裝置中的pins支援kspropsetid_audio屬性。乙個音訊pin可能支援幾個不同的音訊聲道。客戶端取得或設定某個kspropsetid_audio屬性時,必須指定請求應用的那個音訊聲道。當前,微軟定義的ks操作中,要求額外資料的是屬性集合。
對於一般目的操作的標準guid和識別符號,可以在標頭檔案 ks.h 中找到。多**技術的特別的類的標準guid和識別符號可以在k**edia.h中找到。
客戶發布i/o請求來取得和設定屬性,執行方法,和註冊或者取消註冊事件通知。客戶為這些i/o請求中的每個都傳遞兩個緩衝:l
instance spectification.客戶指定操作例項作為i/o請求的目標。每乙個例項規範以乙個頭部開始,這個頭部描述了操作集合,操作id,和操作標記,接著的是指定操作的確認資料。下面的**描述了頭部結構。
operation type
instance specification header
property
ksproperty
event
ksevent
method
k**ethod
為了處理需要擴充套件資料結構的操作,驅動使用擴充套件資料結構,結構包含例項頭部作為第乙個成員。例如,kspropsetid_pin屬性集合中的屬性使用ksp_pin結構來指定屬性例項。合適的擴充套件資料結構和每個單獨的屬性集合一起記入文件。l
operation data.客戶為操作指定資料緩衝。屬性請求使用這個緩衝要麼取得要麼設定屬性。方法請求使用這個緩衝輸入或輸出。事件通知請求使用這個屬性確定請求的事件通知型別。
1.2.1 ks 屬性
對ks操作的概述,參看 ks 屬性,事件,和方法 一節。
客戶使用ioctl_ks_property請求來取得或設定屬性集。ksproperty的
flags成員指定操作型別:ksproperty_type_get是乙個取得屬性請求,而ksproperyt_type_set是乙個設定屬性請求。
當客戶產生乙個取得屬性請求時,驅動返回客戶傳遞的資料緩衝中的屬性。當客戶產生乙個設定屬性請求時,驅動使用傳遞過來的資料緩衝中的資料來指定新的屬性值。
flags成員的額外的值允許客戶請求關於乙個屬性的資訊。例如:
l ksproperty_type_setsupport
如果客戶指定這個標識,驅動在資料緩衝中沒有返回資料,但是如果它支援這個屬性集合,就返回status_success,如果不支援就返回乙個錯誤**。
l ksproperty_type_basicsupport
如果客戶指定這個標識,如果驅動支援這個屬性,就返回status_sccess,如果不支援就返回乙個錯誤**。在資料緩衝中,驅動傳遞關於這個屬性的資訊,例如,如果這個屬性是唯讀,只寫,或者讀寫。
l ksproperty_type_defaultvalues
如果客戶指定這個標識,驅動用資料緩衝來返回它的值內類的描述,包括可能允許的範圍和預設的值。
1.2.2 ks 事件
對ks操作的概述,參看 ks 屬性,事件,和方法 一節。
驅動的客戶可以請求當擁有乙個特定的條件時,被通知。例如,客戶計畫當資料流的時間戳到達某點時執行指定的動作。客戶提交乙個ioctl_ks_enable_event請求來請求事件通知。在這個請求的資料緩衝中,客戶傳遞乙個kseventdata結構來描述當事件發生時,驅動如何通知客戶。
客戶可以通過ioctl_ks_disable_event請求來取消註冊事件。客戶傳遞初始資料緩衝的位址來標識事件。這個位址不必指向初始資料緩衝-驅動簡單地用它來標識哪個事件通知取消。
第一章 Linux核心簡介
unix 中所有的東西都被當作檔案對待。unix 核心和相關的系統工具軟體是用 c 語言編寫而成。unix 程序建立非常迅速,並且有乙個非常獨特的 fork 系統呼叫。linux 是非商業化的產品,它使用 gnu 的 general public license gpl 第二版本作為限制條款。執行於...
第一章 Linux核心簡介
1.linux是類unix系統,但他不是unix。儘管linux借鑑了unix的許多設計並且實現了unix的api 由posix標準和其他single unix specification定義的 但linux沒有像其他unix變種那樣直接使用unix的原始碼。2.linux系統的基礎是核心 c庫 工...
第一章 核心模組 elf檔案
1.核心模組的檔案格式elf elf分為三部分 頭部elf header 中間section,尾部section header table 1 elf header部分 大小52位元組 e type 表明檔案型別,驅動值為1 e shoff 表明section header table部分在檔案中的...