日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

windows驱动开发详解学习笔记

發(fā)布時間:2023/12/13 windows 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 windows驱动开发详解学习笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. windows驅(qū)動分兩類,NT式驅(qū)動和WDM驅(qū)動,后者支持即插即用;

2. DriverEntry是入口函數(shù),傳入?yún)?shù):pDriverObject由IO管理器傳入;

3. WDM驅(qū)動中,AddDevice創(chuàng)建設(shè)備對象,由PnP管理器調(diào)用;傳入?yún)?shù):(DriverObject, PhysicalDeviceObject),第一個參數(shù)是DriverEntry的傳入?yún)?shù),第二個參數(shù)由總線驅(qū)動創(chuàng)建的PDO;

4. IRP_MJ_PNP分很多子類,包括IRP_MN_START_DEVICE、IRP_MN_REMOVE_DEVICE、IRP_MN_STOP_DEVICE等等;

5. PE格式(Portable Execute),二進制可執(zhí)行格式;

6. 函數(shù)調(diào)用這一過程用匯編語言展現(xiàn)出來是這樣子的:參數(shù)入棧-->ebp入棧-->將esp作為ebp-->esp減一定空間(增長)-->處理-->將ebp作為esp-->ebp出棧-->返回。

7. 函數(shù)調(diào)用約定,重點區(qū)分_cdecl和_stdcall。函數(shù)在調(diào)用前后需要保持esp平衡,_cdecl是C語言默認調(diào)用約定,函數(shù)返回后由調(diào)用者將esp+參數(shù)占用字節(jié)數(shù),保持平衡,例如調(diào)用int add(int, int)后,調(diào)用者執(zhí)行 add,esp 8;_stdcall是標準調(diào)用約定,函數(shù)返回時執(zhí)行ret x(參數(shù)占用字節(jié)數(shù)),自助保持堆棧平衡,例如ret 8。不同調(diào)用約定會使函數(shù)在編譯階段產(chǎn)生差異的符號鏈接名。 例如_cdecl約定下為_add,而_stdcall約定下為_add@8. 不同的符號鏈接名可能導(dǎo)致link階段的無法解析外部符號錯誤。

8. windows以樹形結(jié)構(gòu)組織系統(tǒng)內(nèi)的設(shè)備,稱之為設(shè)備樹。垂直結(jié)構(gòu),從底到上的構(gòu)建設(shè)備樹,總線驅(qū)動構(gòu)建設(shè)備的PDO,設(shè)備驅(qū)動構(gòu)建設(shè)備對象,這種垂直結(jié)構(gòu)成為設(shè)備堆棧。平行結(jié)構(gòu),相同的設(shè)備擁有一致的設(shè)備堆棧。

9. 在windows系統(tǒng)內(nèi),每個進程有自己獨立的4GB虛擬內(nèi)存空間,其中低2GB(0~0x7FFFFFFF)為用戶模式空間,高2GB是內(nèi)核模式空間,用戶態(tài)程序只能訪問用戶模式空間,內(nèi)核程序可以訪問整個4GB空間。進程切換發(fā)生時,內(nèi)核空間不切換,之切換用戶模式空間。

10. 在驅(qū)動程序中,DriverEntry和AddDevice是由系統(tǒng)進程調(diào)用的,運行在系統(tǒng)進程上下文;而其他的派遣函數(shù)例程運行在程序上下文。

11. 分頁內(nèi)存和非分頁內(nèi)存。在虛擬內(nèi)存管理中,分頁內(nèi)存會被交換出物理內(nèi)存,非分頁內(nèi)存會一直駐留在物理內(nèi)存中。分頁內(nèi)存只能被運行在DISPATCH_LEVEL級別以下的函數(shù)使用,如果程序運行在DISPATCH_LEVEL以上,一定要用非分頁內(nèi)存。因為缺頁異常的回調(diào)函數(shù)運行在DISPATCH_LEVEL上, DISPATCH_LEVEL以上的程序使用分頁內(nèi)存會導(dǎo)致計算機藍屏。

12. 內(nèi)核堆內(nèi)存分配的函數(shù)使用ExAllocatePool和ExFreePool, 需要指定內(nèi)存分配的類型。在內(nèi)核模式下,無法使用C++提供的new或delete操作,因為在windows平臺下,new實現(xiàn)依賴于win32 API,而在內(nèi)核模式下是無法使用win32 API。

13. windows DDK實現(xiàn)了一個內(nèi)置的通用雙向鏈表結(jié)構(gòu),LIST_ENTRY,類似于Linux中使用的雙向鏈表結(jié)構(gòu),list_head

14. windows DDK內(nèi)置了內(nèi)存池Lookaside,只能的避免內(nèi)存空洞。

15. 微軟編譯器提供的結(jié)構(gòu)化異常處理機制,當程序在執(zhí)行過程中遇到異常,就會在當前try塊外尋找except塊,如果當前try塊沒有設(shè)置except捕獲異常塊,則進入上一層try塊,直至交由操作系統(tǒng)處理。這一過程成為回卷。

16. 如果if或者else,只有單個函數(shù)或語句的情況下是允許的。但是如果函數(shù)本質(zhì)是一個多行的宏定義,則容易出現(xiàn)很難察覺的問題。所以在每次if或者else時,都要加一個{},是非常必要的。

17. 應(yīng)用程序向CreateFile傳入符號鏈接名打開設(shè)備,一般是這個樣子: \\.\helloWDM,寫成C語言字符串成”\\\\.\\helloWDM”

18. 緩沖區(qū)讀寫/直接讀寫的區(qū)別:需要簡單說明一下windows IO讀寫的機制。用戶態(tài)程序調(diào)用win32 API WriteFile,對應(yīng)到內(nèi)核的Native API NtWriteFile,NtWriteFile負責(zé)創(chuàng)建IRP包分發(fā)給響應(yīng)的Dispatch。用戶態(tài)程序需要向WriteFile傳入1個用戶空間的數(shù)據(jù)緩沖區(qū)buf1,假設(shè)起始地址0x400。windows是多任務(wù)環(huán)境,當進程切換時,用戶空間發(fā)生切換,所以NtWriteFile直接操作0x400就很可能進入其他進程的用戶空間。

緩沖區(qū)讀寫,指的是windows負責(zé)在內(nèi)核空間開辟一段相同大小的緩沖區(qū),并將WriteFile的緩沖區(qū)復(fù)制過去,這樣用戶進程切換共用內(nèi)核空間,不會出問題。讀操作也是類似的操作。這種方式存在內(nèi)核的緩沖區(qū)復(fù)制,效率較低,適合在小塊內(nèi)存的情況下。

直接讀寫:指的是,windows先鎖住(不交換出物理內(nèi)存)空間的緩沖區(qū),然后將這塊物理內(nèi)存映射到內(nèi)核空間,這樣NtWriteFile操作的就是同一塊物理內(nèi)存,不會出問題。這種方式,涉及的過程比起簡單的內(nèi)存復(fù)制來說要復(fù)雜,但是效率高,適合數(shù)據(jù)量大的情況。另外,說明一下:windows內(nèi)核采用MDL記錄用戶緩沖區(qū)到物理內(nèi)存的映射關(guān)系。

19. PIC與APIC區(qū)別:PIC(Programable Interrupt Controller),是傳統(tǒng)PC的方案,使用2片8259級聯(lián)實現(xiàn)最多16個中斷信號;目前大部分機器采用APIC(Advanced Programable Interrupt Controller),兼容PIC模式,實現(xiàn)最多24個中斷信號。

20. 在PC機24個中斷信號的基礎(chǔ)上,windows設(shè)計了32級的IRQL。關(guān)心IRQL最低的PASSIVE_LEVEL,APC_LEVEL,DISPATCH_LEVEL。用戶模式程序運行在PASSIVE_LEVEL,驅(qū)動程序的派遣函數(shù)、AddDevice、DriverEntry等一般函數(shù)也運行于PASSIVE_LEVEL,DPC和StartIO運行于DISPATCH_LEVEL,OS的線程調(diào)度程序運行于DISPATCH_LEVEL。對于線程來說,高的IRQL級別可以有更多的機會獲得CPU。當線程執(zhí)行ReadFile,其IRP對應(yīng)的響應(yīng)派遣函數(shù)運行于PASSIVE_LEVEL,與ReadFile同屬于一個線程的上下文。

常常采用提高線程的IRQL的方式,實現(xiàn)多線程資源同步,避免切換。可是對于多核處理器,這并不好使。

21.

轉(zhuǎn)載于:https://www.cnblogs.com/yuqiao-ray-vision/p/3680728.html

總結(jié)

以上是生活随笔為你收集整理的windows驱动开发详解学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。