成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

探索Windows CE 6驅(qū)動(dòng)程序新特性

開(kāi)發(fā)
本文向您介紹Windows CE 6驅(qū)動(dòng)程序的新特性,包括訪問(wèn)檢查、Marshalling和用戶模式下的驅(qū)動(dòng)程序等。

Windows CE 6驅(qū)動(dòng)程序新特性之訪問(wèn)檢查

訪問(wèn)檢查是用來(lái)檢查函數(shù)的調(diào)用者是否有足夠的權(quán)限去訪問(wèn)傳遞給這個(gè)函數(shù)的內(nèi)存。訪問(wèn)檢查是很必要的,它可以防止惡意的應(yīng)用程序利用驅(qū)動(dòng)程序去完成需要特權(quán)才能訪問(wèn)的資源。設(shè)備驅(qū)動(dòng)程序由于在Windows Embedded CE 6.0中處于內(nèi)核空間所以是一種特權(quán)程序,可以訪問(wèn)很多系統(tǒng)的資源。而工作在用戶態(tài)的應(yīng)用程序卻不是。如果一個(gè)應(yīng)用程序利用設(shè)備驅(qū)動(dòng)程序去讀寫(xiě)系統(tǒng)的內(nèi)存,那么設(shè)備驅(qū)動(dòng)程序?qū)嶋H上就相當(dāng)于是授予了這個(gè)應(yīng)用程序高的訪問(wèn)權(quán)限。所以在設(shè)備驅(qū)動(dòng)程序中進(jìn)行訪問(wèn)檢查可以保護(hù)操作系統(tǒng)的內(nèi)存不受惡意應(yīng)用程序的破壞。

在Windows CE 5.0中,設(shè)備驅(qū)動(dòng)程序是通過(guò)MapCallerPtr API來(lái)對(duì)指針參數(shù)和嵌套的指針參數(shù)進(jìn)行訪問(wèn)檢查的。

  1. struct MyStruct { UCHAR *pEmbedded; DWORD dwSize; };  
  2.  
  3. // Windows CE 5.0 and prior versions  
  4.  
  5. // In XXX_IOControl...  
  6.  
  7.    
  8. MyStuct *p = ( MyStruct*) pInput;  
  9.  
  10. g_pMappedEmbedded = MapCallerPtr(p->pEmbedded);  
  11.  
  12. // Fail if g_pMappedEmbedded == NULL ...  
  13.  

在Windows Embedded CE 6.0中,設(shè)備驅(qū)動(dòng)程序只需要檢查嵌套的指針參數(shù)是否有效就可以了。所不同的是在Windows Embedded CE 6.0中需要使用CeOpenCallerBuffer這個(gè)API來(lái)檢查是否對(duì)于某一段內(nèi)存,調(diào)用進(jìn)程是否有訪問(wèn)權(quán)限。

  1. // Now in the New CE Version  
  2.  
  3. // In XXX_IOControl...  
  4.  
  5. hr = CeOpenCallerBuffer((PVOID*)&g_pMappedEmbedded, pInput->pEmbedded, pInput->dwSize, ARG_I_PTR, FALSE);  
  6.  
  7. // Fail if FAILED(hr) == true  
  8.  
  9. // When done with pointer...  
  10.  
  11. hr = CeCloseCallerBuffer((PVOID)g_pMappedEmbedded, pInput->pEmbedded, pInput->dwSize, ARG_I_PTR );  
  12.  

Windows CE 6驅(qū)動(dòng)程序新特性之Marshalling

處于內(nèi)核態(tài)的線程對(duì)位于用戶空間的內(nèi)存的訪問(wèn)可以分為兩種方式。同步訪問(wèn)(Synchronous Access)和異步訪問(wèn)(Asynchronous Access)。同步訪問(wèn)是指,當(dāng)訪問(wèn)這塊內(nèi)存區(qū)域時(shí),處于內(nèi)核態(tài)的線程是在調(diào)用者的上下文環(huán)境內(nèi)。而異步訪問(wèn)正好相反,設(shè)備驅(qū)動(dòng)程序所擁有的一個(gè)線程要訪問(wèn)的一塊內(nèi)存區(qū)域,而該區(qū)域正位于其他進(jìn)程的地址空間中,那么這就是異步訪問(wèn)。

舉個(gè)異步訪問(wèn)的例子,比如應(yīng)用程序通過(guò)WriteFile API來(lái)向設(shè)備SD卡中寫(xiě)入一段數(shù)據(jù),最后寫(xiě)的請(qǐng)求會(huì)通過(guò)操作系統(tǒng)內(nèi)核發(fā)送到SD卡的設(shè)備驅(qū)動(dòng)中,由設(shè)備驅(qū)動(dòng)程序來(lái)寫(xiě)入數(shù)據(jù)。但是I/O操作是一個(gè)很慢的操作,為了使CPU達(dá)到高的利用率,內(nèi)核往往會(huì)在這時(shí)重新調(diào)度一個(gè)線程開(kāi)始執(zhí)行,這樣用戶空間就可能發(fā)生了一次切換。這里說(shuō)可能,是因?yàn)槿绻徽{(diào)度的線程和當(dāng)前的應(yīng)用程序(也就是當(dāng)前進(jìn)程)處于同一進(jìn)程空間的話,那么就不發(fā)生進(jìn)程的切換,并且要寫(xiě)入的這段數(shù)據(jù)由于還是位于當(dāng)前進(jìn)程空間中,所以就是對(duì)于這塊數(shù)據(jù)的訪問(wèn)就是同步的。反之,如果被調(diào)度的線程不處于當(dāng)前進(jìn)程的空間,那么就會(huì)發(fā)生一次進(jìn)程的切換,新的進(jìn)程會(huì)替換老的進(jìn)程,這時(shí)要寫(xiě)入的這塊數(shù)據(jù)區(qū)域?qū)τ谠O(shè)備驅(qū)動(dòng)程序中的線程來(lái)說(shuō)就是無(wú)效的,這也稱為異步訪問(wèn)。

對(duì)于異步訪問(wèn)必須采用一種叫Marshalling的技術(shù)來(lái)處理被訪問(wèn)的數(shù)據(jù)區(qū)域。

在Windows CE 5.0中,所有的用戶態(tài)進(jìn)程共享底部的虛擬地址。所以當(dāng)Slot 0中被替換為不同進(jìn)程時(shí),由于所有的進(jìn)程的虛擬地址空間對(duì)于設(shè)備驅(qū)動(dòng)程序來(lái)說(shuō)都可見(jiàn),只需要對(duì)指向數(shù)據(jù)塊首地址的指針做一次偏移,就可以得到這塊數(shù)據(jù)。

在Windows Embedded CE 6.0中,每個(gè)用戶態(tài)的進(jìn)程都有自己獨(dú)有的虛擬地址空間,每個(gè)進(jìn)程的虛擬地址空間都是受到保護(hù)的。所以對(duì)一塊內(nèi)存做Marshall不再是簡(jiǎn)單的將指針進(jìn)行偏移。這時(shí)可以采用兩種方法來(lái)對(duì)一塊內(nèi)存做Marshall,一種方法是將這塊內(nèi)存拷貝一份這樣就可以安全的訪問(wèn),這種方法稱為復(fù)制。另一種方法是用一個(gè)新的虛擬地址去引用所對(duì)應(yīng)的物理,這樣一來(lái)這塊數(shù)據(jù)就分別被兩個(gè)指針?lè)謩e引用,這種方法稱為別名。

Marshall一塊內(nèi)存區(qū)域需要區(qū)分同步訪問(wèn)和異步訪問(wèn)。在Windows CE 5.0中,對(duì)于同步訪問(wèn)來(lái)說(shuō),不需要做多余的工作,只需要調(diào)用MapCallerPtr API來(lái)Marshall嵌套指針?biāo)傅牡刂芳纯伞?duì)于異步訪問(wèn),線程對(duì)于每個(gè)Slot都有一定的訪問(wèn)權(quán)限,所以需要通過(guò)調(diào)用SetProcPermissions來(lái)先獲得調(diào)用進(jìn)程Slot的訪問(wèn)權(quán)限,然后調(diào)用MapCallerPtr來(lái)Marshall所要異步訪問(wèn)的內(nèi)存。

  1. // Windows CE 5.0 and prior versions  
  2.  
  3.    
  4. // In XXX_IOControl...  
  5.  
  6.    SetProcPermissions(-1);  
  7.  
  8.    g_pMappedEmbedded = MapCallerPtr( p->pEmbedded );  
  9.  
  10. // Fail if g_pMappedEmbedded == NULL ...  

在Windows Embedded CE 6.0中,對(duì)于同步訪問(wèn),通過(guò)設(shè)備驅(qū)動(dòng)程序通過(guò)調(diào)用CeOpenCallerBuffer來(lái)Marshall嵌套指針?biāo)傅臄?shù)據(jù)塊的首地址,當(dāng)這塊數(shù)據(jù)使用完以后,設(shè)備驅(qū)動(dòng)程序調(diào)用CeFreeCallerBuffer來(lái)釋放Marshall所得資源。對(duì)于異步訪問(wèn),假設(shè)設(shè)備驅(qū)動(dòng)程序可以同步的訪問(wèn)一塊內(nèi)存,那么這時(shí)就可以通過(guò)調(diào)用CeAllocAsynchronousBuffer來(lái)Marshall這塊內(nèi)存用來(lái)做異步訪問(wèn)之用。在使用完之后,可以通過(guò)調(diào)用CeFreeAsynchronousBuffer來(lái)釋放Marshall所得資源。

  1. // Now in the New OS Version  
  2.  
  3. // In XXX_IOControl after CeOpenCallerBuffer generates  
  4.  
  5. // g_pMappedEmbedded...  
  6.  
  7.  
  8. hr = CeAllocAsynchronousBuffer((PVOID*)&g_pMarshalled, g_pMappedEmbedded, pInput->dwSize, ARG_I_PTR);   
  9.  
  10. // Fail if FAILED(hr) == true  
  11.  
  12.  
  13. // When done with pointer...  
  14.  
  15. hr = CeFreeAsynchronousBuffer((PVOID)g_pMarshalled, g_pMappedEmbedded, pInput->dwSize, ARG_I_PTR);   
  16.  
  17.  
  18. // Now call CeCloseCallerBuffer as usual...  
  19.  

Windows CE 6驅(qū)動(dòng)程序新特性之用戶模式下的驅(qū)動(dòng)程序

在Windows Embedded CE 6.0之前,設(shè)備驅(qū)動(dòng)程序是加載在device.exe進(jìn)程之中的,而device.exe與普通應(yīng)用程序一樣也是用戶態(tài)的進(jìn)程。所以每次應(yīng)用程序希望能夠與外設(shè)進(jìn)行交互時(shí),都需要通過(guò)操作系統(tǒng)內(nèi)核轉(zhuǎn)發(fā)請(qǐng)求到相應(yīng)的驅(qū)動(dòng)程序。這樣一個(gè)請(qǐng)求就可以需要反復(fù)的進(jìn)出內(nèi)核多次,還需要在不同的進(jìn)程間進(jìn)行切換。這樣做的好處和缺點(diǎn)同樣的明顯,優(yōu)點(diǎn)是操作系統(tǒng)的穩(wěn)定性得到了提高,不會(huì)因?yàn)槟硞€(gè)設(shè)備驅(qū)動(dòng)中的缺陷而使整個(gè)操作系統(tǒng)崩潰。但缺點(diǎn)是完成請(qǐng)求的效率太低。

在Windows Embedded CE 6.0中,設(shè)備驅(qū)動(dòng)程序能夠工作在用戶模式或是內(nèi)核模式兩種不同的模式。由于在Windows Embedded CE 6.0新的體系結(jié)構(gòu)中將操作系統(tǒng)關(guān)鍵的部件如文件系統(tǒng)Filesystem.exe、設(shè)備驅(qū)動(dòng)程序管理Device.exe等都移進(jìn)了操作系統(tǒng)內(nèi)核之中,驅(qū)動(dòng)程序完成一個(gè)請(qǐng)求不再需要在不同的進(jìn)程下進(jìn)行切換,也不需要反復(fù)的進(jìn)出內(nèi)核,所以內(nèi)核模式下的驅(qū)動(dòng)程序完成請(qǐng)求的效率將會(huì)大大的提高。但是這樣的效率提高也是要有代價(jià)的。內(nèi)核模式下的驅(qū)動(dòng)程序需要有很高的穩(wěn)定性,任何一個(gè)錯(cuò)誤都可能引起整個(gè)操作系統(tǒng)的崩潰。為了解決這個(gè)問(wèn)題,Windows Embedded CE 6.0中還設(shè)計(jì)了另一類稱為用戶模式的設(shè)備驅(qū)動(dòng)程序。

Windows Embedded CE 6.0中設(shè)計(jì)了一個(gè)用戶進(jìn)程udevice.exe用來(lái)加載設(shè)備驅(qū)動(dòng)程序。因?yàn)槭潜挥脩魬B(tài)的進(jìn)程所加載,所以這類驅(qū)動(dòng)程序就工作在用戶空間,這類驅(qū)動(dòng)程序就成為用戶模式下的設(shè)備驅(qū)動(dòng)程序。用戶模式的驅(qū)動(dòng)程序無(wú)疑將增加操作系統(tǒng)的穩(wěn)定性,并且由于這類驅(qū)動(dòng)程序工作在用戶空間,所以能力有限,不能使用諸如VirtualCopy這樣的特權(quán)API,也不能對(duì)系統(tǒng)中的硬件資源有任意的訪問(wèn)權(quán)限。

用戶模式的設(shè)備驅(qū)動(dòng)程序還有一個(gè)特點(diǎn)就是它們與內(nèi)核模式的設(shè)備驅(qū)動(dòng)程序具有高度的兼容性。一個(gè)好的用戶模式的設(shè)備驅(qū)動(dòng)程序的源代碼不需要做任何的改動(dòng)就可以做為內(nèi)核模式的設(shè)備驅(qū)動(dòng)程序被加載進(jìn)內(nèi)核空間。區(qū)分用戶模式的設(shè)備驅(qū)動(dòng)程序和內(nèi)核模式的設(shè)備驅(qū)動(dòng)程序標(biāo)志就是設(shè)備驅(qū)動(dòng)程序在系統(tǒng)注冊(cè)表中的Flag值。當(dāng)Flag具有DEVFLAGS_LOAD_AS_USERPROC(0x10)時(shí),系統(tǒng)會(huì)將設(shè)備驅(qū)動(dòng)程序加載成用戶模式,如果沒(méi)有該標(biāo)志就加載成內(nèi)核模式。

總的來(lái)說(shuō),用戶模式下Windows CE 6驅(qū)動(dòng)程序新特性的設(shè)備驅(qū)動(dòng)程序和內(nèi)核模式下的設(shè)備驅(qū)動(dòng)程序是很相似的。在有了用戶模式設(shè)備驅(qū)動(dòng)程序和內(nèi)核模式設(shè)備驅(qū)動(dòng)程序后,在OEM開(kāi)發(fā)BSP的過(guò)程中,如果采用了某些第三方的,未經(jīng)充分測(cè)試的驅(qū)動(dòng)程序后。可以先將這些驅(qū)動(dòng)程序做為用戶模式下的設(shè)備驅(qū)動(dòng)程序加載到用戶空間,等到整個(gè)系統(tǒng)經(jīng)過(guò)測(cè)試可以長(zhǎng)時(shí)間穩(wěn)定運(yùn)行后,再將其轉(zhuǎn)變成內(nèi)核模式下的驅(qū)動(dòng)程序加載到內(nèi)核空間以提高整個(gè)系統(tǒng)的效率。

 

【編輯推薦】

  1. WinCE編譯過(guò)程的四個(gè)階段
  2. WinCE中觸摸屏驅(qū)動(dòng)開(kāi)發(fā)詳解
  3. Windows Mobile和WinCE的區(qū)別
  4. WinCE中串口驅(qū)動(dòng)及接口函數(shù)介紹
  5. WinCE中nandflash驅(qū)動(dòng)開(kāi)發(fā)介紹
責(zé)任編輯:佚名 來(lái)源: 博客大巴
相關(guān)推薦

2017-03-03 08:40:32

2019-10-22 15:40:34

Windows 10驅(qū)動(dòng)程序Windows

2018-11-19 10:15:26

Windows 10WiFi驅(qū)動(dòng)程序

2019-03-27 13:20:31

Windows 10更新驅(qū)動(dòng)程序

2009-07-06 18:17:46

JDBC驅(qū)動(dòng)程序

2009-05-28 13:27:33

Windows CE

2009-03-09 18:48:26

Windows 7驅(qū)動(dòng)開(kāi)發(fā)

2023-09-26 19:20:09

微軟開(kāi)源windows

2020-12-20 09:52:44

Windows10操作系統(tǒng)Windows

2018-09-03 15:45:48

Windows 10Windows驅(qū)動(dòng)程序

2022-01-10 07:17:02

安全工具CFB模糊測(cè)試

2012-11-22 13:49:52

Windows 7

2018-07-18 16:35:06

Windows 10Windows驅(qū)動(dòng)程序

2015-09-10 14:42:37

自動(dòng)更新UpdateWindows 10

2010-03-12 15:28:26

Windows Emb

2011-01-10 18:21:38

linux編寫(xiě)程序

2009-08-12 18:20:39

C#事件驅(qū)動(dòng)程序

2010-01-07 13:27:22

Linux驅(qū)動(dòng)程序

2017-02-20 08:40:03

數(shù)據(jù)集成驅(qū)動(dòng)

2009-11-04 13:14:59

Windows Emb驅(qū)動(dòng)程序
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 欧美日韩在线高清 | 在线日韩 | 日韩在线成人 | 亚洲欧美一区二区三区国产精品 | 国产97碰免费视频 | 第四色狠狠 | 91社区在线观看高清 | 成人精品国产 | 国产精品美女久久久久久久网站 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 国产欧美在线 | 精品欧美一区二区三区精品久久 | 欧美精品久久久久久久久久 | www.狠狠干 | 国产精品激情 | 午夜影视大全 | а_天堂中文最新版地址 | 中文字幕一区二区三区四区 | 青青草精品视频 | 日本天天色| 美国十次成人欧美色导视频 | 视频在线日韩 | 日本一级淫片免费啪啪3 | 精品久久久久久久久久 | 久久久久久精 | 成人免费大片黄在线播放 | 中文字幕一区二区三区四区五区 | 久久成人18免费网站 | 一区二区av在线 | 羞羞午夜 | 一级片在线免费播放 | 男女羞羞视频在线看 | 在线精品一区二区 | 一区二区三区国产在线观看 | 亚洲精品福利在线 | 国产成人精品在线播放 | 国产成人高清 | 97日日碰人人模人人澡分享吧 | 国产天堂 | 亚洲福利视频一区二区 | 在线久草|