毛片网站在线看_天堂俺去俺来也www久久婷婷_日韩av免费网站_18性欧美xxxⅹ性满足_一区二区三区韩国免费中文网站 _性xx色xx综合久久久xx_999亚洲国产精


曙海教育集團論壇Windows驅(qū)動開發(fā)專題Windows驅(qū)動開發(fā) → 討論Windows虛擬設(shè)備驅(qū)動


  共有10358人關(guān)注過本帖樹形打印

主題:討論Windows虛擬設(shè)備驅(qū)動

美女呀,離線,留言給我吧!
wangxinxin
  1樓 個性首頁 | 博客 | 信息 | 搜索 | 郵箱 | 主頁 | UC


加好友 發(fā)短信
等級:青蜂俠 帖子:1393 積分:14038 威望:0 精華:0 注冊:2010-11-12 11:08:23
討論Windows虛擬設(shè)備驅(qū)動  發(fā)帖心情 Post By:2010-12-17 13:38:20

摘要:討論Windows虛擬設(shè)備驅(qū)動(VXD)技術(shù),并采用此項技術(shù)示范性地做出應(yīng)用于PC串口實時通信的虛擬驅(qū)動程序,找到一種可以在PC中實現(xiàn)實時通信的途徑。

    關(guān)鍵詞:VXD 實時 串口通信

引言

在微軟的視窗操作系統(tǒng)中,系統(tǒng)內(nèi)核掌管所有的應(yīng)用程序,通過獨特的任務(wù)調(diào)度算法實現(xiàn)CPU的分時多任務(wù)處理方式。多任務(wù)處理對大多數(shù)用戶可能是件好事,但是對那些想把實時通信建立在Windows操作系統(tǒng)上的特殊用戶來說,操作界面的圖形化并不比MS-DOS的單任務(wù)更具吸引力。在視窗操作系統(tǒng)里可以進行實時通信和控制碼?答案是:VXD技術(shù)可以幫我們在獲取友好的人機界面的同時還擁有很強的實時性。

1 VXD技術(shù)解析

VXD技術(shù)可追溯到Windows3.1,它的引入就是要讓操作系統(tǒng)實現(xiàn)多工以及硬件資源的共享。為了支持多個MS-DOS任務(wù)同時執(zhí)行,Windows98讓每個MS-DOS應(yīng)用程序在各自的虛擬機(VM)上運行,各自互不相干;而所有的Widnows應(yīng)用程序卻都在一個虛擬機上運行。圖1所示的結(jié)構(gòu)框圖很好地說明了Windows98的整體架構(gòu)。

圖1中,由眾多的VXD組成系統(tǒng)級代碼處于最底層。其中,處于中心地位的是一名為VMM32的VXD,它負(fù)責(zé)協(xié)調(diào)和管理所有的VXDs。其它VXDs則通過消息機制(這個消息機制由VMM32.VXD來維護)彼此聯(lián)系。由所有VXDs開放出的服務(wù)接口(API)組成了一個服務(wù)網(wǎng),它們彼此通過合作的方式,提供Windows98的系統(tǒng)底層驅(qū)動服務(wù)。

從以上Windows98系統(tǒng)架構(gòu)可以看出,要想在視窗平臺下獲取很強的實時性,僅靠提升應(yīng)用程序線程優(yōu)先級的方法是不夠的。因為Win32應(yīng)用程序代碼屬于Ring3級,而VXD代碼則屬于Ring0級;采用VXD撰寫的實時通信程序可以完全不受代碼限制,可以直接對硬件進行操作。VXD的這個特點正是實時通信建立所必須的。

設(shè)計實時通信的VXD前,先解釋以下幾個問題:

①VMM32使用VPICD.VXD虛擬化每個硬件和軟件中斷。VMM32為每個虛擬機(VM)維護一個IDT結(jié)構(gòu),當(dāng)中斷發(fā)生時,CPU先保護中斷現(xiàn)場,然后經(jīng)由當(dāng)前VM的IDT把這個中斷引導(dǎo)至相應(yīng)的中斷處理程式。

中斷的虛擬化,使我們有機會給每個中斷提供新的中斷處理函數(shù),并可以讓多個硬件共享同一個中斷號。VPICD.VXD為我們提供這些服務(wù)。

②VMM有兩個調(diào)度器,用以在多個線程和VMs之間實現(xiàn)搶占式多工。主調(diào)度器負(fù)責(zé)選定下一個將被執(zhí)行的線程。這個選擇可以是一個,也可以是多個。然后,主調(diào)度器把選擇結(jié)果送給所謂的時間片調(diào)度器,并由后者完成各個應(yīng)用程序間的時間片分配。調(diào)度器也時應(yīng)用程序經(jīng)由呼叫Win32線程優(yōu)先調(diào)整API(如SetThreadPriority和SetPriorityClass等)做出回應(yīng)。當(dāng)中斷發(fā)生時,VMM32自動提升中斷處理函數(shù)所在VM之優(yōu)先級,保證中斷處理函數(shù)能及時被執(zhí)行。

③VXD和Win32應(yīng)用程序可直接通信。Win32應(yīng)用程序可通過一個系統(tǒng)API(DevicelOControl(…))來呼叫位于底層的VXD為其服務(wù)。在呼叫VXD前,首先必須調(diào)用CreatFile(…)這個API加載該VXD(如果該VXD是一個靜態(tài)VXD,則不用加載)。所有的呼叫動作其實都通過VMM32完成。VXD也可以通過消息方式和位于上層的Win32應(yīng)用程序通信。She11.VXD為所有希望以消息機制和Win32應(yīng)用程序通信的VXD提供了這一服務(wù)。

以上是編寫一個串口通信驅(qū)動需要的系統(tǒng)層面知識。對于Windows底層的了解。

2 用VXD實現(xiàn)一個實時串口通信驅(qū)動

接下來用VXD技術(shù)實現(xiàn)一個實時串行通信的驅(qū)動。這個VXD是一個動態(tài)(Dynamic)VXD,當(dāng)它的服務(wù)被呼叫時,VMM32會動態(tài)加載這個VXD。作者采用的工具是C+98DDK。當(dāng)然也可以使用其它的工具,如MASM6.11(或更高版本)、VtoolsD。用C搭配DDK完成VXD構(gòu)建的好處是,可以使用C語言完成絕大部分的程序,程序比較容易閱讀和維護。

用C來實現(xiàn)一個VXD驅(qū)動,需要準(zhǔn)備如下條件:一個.ASM的匯編語言接口文件(在其中定義VXD要處理的系統(tǒng)消息和輸出API),一個.C的函數(shù)實現(xiàn)文件(在其中完成自己函數(shù)實體),一個.DEF的定義文件(在其中定義VXD中各個段的別名并匯成一個DDB)和一個.MAK檔(用來編譯并連接生成VXD,可有可無)。在這里,僅給出用C實現(xiàn)的函數(shù)檔。至于其它的文件,可以從本文所列的參考書目或其它文獻中找到相關(guān)文檔的說明。

這個串口通信驅(qū)動程序的功能是:實時送出一個Byte的數(shù)據(jù),實時接收一個Byte的數(shù)據(jù)。作為演示之用,并沒有加入其它代碼。該VXD驅(qū)動主要由如下3個系統(tǒng)消息(由VMM32來維護和管理)處理函數(shù)組成,其代碼如下:

(1)OnSysDynamicDeviceInit()函數(shù)

BOOL OnSysDynamicDeviceInit()

{ //OnSysDynamicDeviceInit

irqhandle=VPICD_Virtualize_IRQ((DWORD)(&irq4));

if(irqhandle= =0){

return FALSE;

}

return TRUE; //OnSysDynamicDeviceInit

}

該函數(shù)用來完成VXD初始化所做的工作。在本例中,由于實時監(jiān)視串口中斷的需要,要給COM1的中斷安裝一個自定義的斷服務(wù)函數(shù)。98DDK已經(jīng)提供了這個函數(shù)的C語言版,其原型是HIRQ static VPICD_Virtualize_IRQ(PVID pvid),在vpicd.h中。該函數(shù)需要一個指針作為參數(shù)(指向名為VPICD_IRQ_Descriptor的結(jié)構(gòu)體),函數(shù)傳回一個指向該虛擬IRQ的句柄(該句柄在后來的VPICD服務(wù)中需要提供)。VPICD_IRQ_Descriptor結(jié)構(gòu)體的組成為:

typedef struct VPICD_IRQ_Descriptor{

USHORT VID_IRQ_Number; //IRQ號(0~15)

USHORT VID_Options; //標(biāo)志位選項

ULONG VID_Hw_Int_Proc; //硬件中斷服務(wù)程序的地址

ULONG VID_Virt_Int_Proc; //虛擬中斷服務(wù)程序

ULONG VID_Mask_Change_Proc //Mask Change調(diào)用例程

ULONG VID_IRET_Proc; //IRET調(diào)用例程

ULONG VID_IRET_Time_Out; //在Vm的進程優(yōu)先級提升之前的最大等待時間

ULONG VID_Hw_Int_Ref; //硬件中斷服務(wù)程序的數(shù)據(jù)存放地址

}VID;

其中只用到三位。在本例中需要聲明一個名為irq4的全局變量為VID結(jié)構(gòu),并付給如下初值:VID irq4={4,0,hwproc,0,0,0,0,500,0},表示將要虛擬化IRQ4,改變其中斷處理函數(shù)為void hwproc(void),該函數(shù)的原型如下:

void hwproc(void){

_asm{

mov dx,0x3f8

in al,dx

mov byte ptr [readin],al

clc

}

return;

}

在這個中斷處理中,僅僅從COM1的數(shù)據(jù)寄存器(地址為3F8h)中讀取接收到的數(shù)值,并把該數(shù)值存放在一個類型為BYTE、名為readin的內(nèi)存中。

(2)OnSysDynamicDeviceExit()函數(shù)

BOOL OnSysDynamicDeviceExit()

{

VPICD_Force_Default_Behavior(irqhandle);

//解除IRQ4虛擬化

return TRUE;

} //OnSysDynamicDeviceExit

該數(shù)提供了用于善后處理VXD在卸載時需要完成的事件。在本例中,和VXD初始化對應(yīng),需要解除對COM1的中斷IRQ4的虛擬化。作者也是用98DDK在vpicd.h中提供的外包函數(shù)void static_inline VPICD_Force_Default_Behavior(HIRQ hirp)。該函數(shù)唯一需要的參數(shù)便是使用VPICD_Virtualize_IRQ函數(shù)傳回的IRQ句柄。

(3)OnDeviceIoControl()函數(shù)

DWORD OnDeviceIoControl(PDIOCPARAMETERS p){

Switch (p->dwIoControlCode)

{

case 1: //端口寫功能

if(!p->lpvOutBuffer||p->cbOutBuffer<1)

{ //輸出緩存的有效性檢查

return ERROR_INVALID_PARAMETER;

}

if(serial_out((DWORD)(p->lpvInBuffer)))

{ //數(shù)據(jù)發(fā)送

*(BYTE*)(p->lpvOutBuffer)=*(BYTE*)(p->lpvInBuffer);

}

else{

*(BYTE*)(p->lpvOutBuffer)=0;

}

open_int(); //打開com1中斷

return 0;

case 2: //端口讀功能

if(*(BYTE*)reading= =0x00)

{ //數(shù)據(jù)讀入

*(BYTE*)(p->lpvOutBuffer)=0x00;

return 0;

}

*(BTYE*)(p->lpvOutBuffer)=*(BYTE*)(readin);

return 0;

}

return 0;

}

return 0;

}

OnDeviceIoControl函數(shù)用來處理Win32應(yīng)用程序?qū)XD的呼叫。Win32應(yīng)用程序的呼叫會讓VMM32送給該VXD一個系統(tǒng)信息,并傳遞進一個DIOCPARAMETERS結(jié)構(gòu)的指針。該結(jié)構(gòu)里包含Win32應(yīng)用程序呼叫時傳遞進來的各個參數(shù)。這個結(jié)構(gòu)的組成如下:

Typedef stunct DIOCParams{

DWORD Internall; //指向客戶寄存器的指針

DWORD VMHande; //該VM的句柄

DWORD Internal2; //指向DDB結(jié)構(gòu)的指針

DWORD dwIoConrolCode; //DeviceIoControl例程中呼叫的控制碼

DWOD lpvInBuffer; //DeviceIoControl例程呼叫所傳遞進來的輸入緩沖區(qū)地址

DWORD cbInBuffer; //輸入緩沖區(qū)的大小

DWORD lpvOutBuffer; //DeviceIoControl例程呼叫所傳遞進來的輸出緩沖區(qū)地址

DWORD cbOutBuffer; //輸出緩沖區(qū)的大小

DWORD lpcbBytesReturned; //拷貝到輸出緩沖區(qū)中的字節(jié)數(shù)(可以為NULL)

DWORD lpOverlapped; //DeviceIoControl例程呼叫所傳遞進來的重疊I/O塊結(jié)構(gòu)

DWORD hDevice; //Ring3層呼叫應(yīng)用程序句柄

DWORD tagProcess; //例程標(biāo)簽

}

DIOPARAMETERS;

其中,dwIoControlCode指明了Win32應(yīng)用程序需要VXD提供的哪一項服務(wù)。在本例中采用一個switch-case語句作為服務(wù)入口,如下所示。其中服務(wù)1為讓串口送出一個字節(jié),服務(wù)2為讀取一個已經(jīng)由串口接收的字節(jié)。函數(shù)open_int()是用來初始化串口以便接收字節(jié)數(shù)據(jù);函數(shù)BOOL serial_out(DWORD pBuffer)是讓串口發(fā)出一個字節(jié)。它們的函數(shù)體分別如下:

BOOL serial_out(DWORD pBuffer){

if(pBuffer= =NULL){

return FALSE;

}


支持(0中立(0反對(0單帖管理 | 引用 | 回復(fù) 回到頂部

返回版面帖子列表

討論Windows虛擬設(shè)備驅(qū)動








簽名
毛片网站在线看_天堂俺去俺来也www久久婷婷_日韩av免费网站_18性欧美xxxⅹ性满足_一区二区三区韩国免费中文网站 _性xx色xx综合久久久xx_999亚洲国产精
一区二区视频在线看| 亚洲品质自拍视频网站| 成人免费精品视频| 懂色中文一区二区在线播放| 成人午夜在线视频| 91久久一区二区| 欧美一区二视频| 久久久久久麻豆| 亚洲欧洲日产国产综合网| 亚洲自拍偷拍av| 久久精品国产精品青草| 成人精品一区二区三区中文字幕| 91美女视频网站| 精品国产乱码久久久久久久久| 国产亚洲欧美色| 国产精品久99| 蜜臀av一区二区在线观看| 国产精品白丝av| 99久久久免费精品国产一区二区| 色狠狠综合天天综合综合| 91精品在线观看入口| 国产性色一区二区| 日本不卡视频在线| 99视频在线精品| 欧美日韩在线电影| 国产精品丝袜一区| 日韩av电影免费观看高清完整版 | 日韩免费观看高清完整版在线观看| 中文字幕免费观看一区| 亚洲成人三级小说| 97久久超碰国产精品电影| 3d成人动漫网站| 亚洲精品网站在线观看| 国产成人一区二区精品非洲| 欧美放荡的少妇| 伊人开心综合网| 不卡影院免费观看| 久久久亚洲精品石原莉奈| 日韩av中文在线观看| 欧美日韩一区 二区 三区 久久精品 | 91.麻豆视频| 亚洲黄色av一区| 成人午夜激情影院| 26uuu精品一区二区| 日韩精品电影一区亚洲| 欧美亚洲丝袜传媒另类| 亚洲视频资源在线| 成人黄色国产精品网站大全在线免费观看| 日韩你懂的在线观看| 蜜桃av一区二区| 欧美一区二区三区不卡| 日本欧美在线观看| 91精品国产综合久久精品app| 亚洲成人av免费| 欧美美女一区二区在线观看| 亚洲国产视频a| 欧美日韩国产电影| 日韩—二三区免费观看av| 91精品国产91久久久久久最新毛片 | 国产精品99久久久久久久女警| 日韩一级成人av| 美女视频黄a大片欧美| 欧美一区二区视频免费观看| 奇米一区二区三区av| 日韩丝袜情趣美女图片| 精品一区二区精品| 中文字幕精品在线不卡| 一本色道综合亚洲| 午夜精品久久久久久| 91精品免费在线| 久久99最新地址| 国产亚洲欧美中文| 91视频www| 亚洲福利视频一区二区| 91精品国产一区二区三区蜜臀| 乱一区二区av| 欧美高清在线视频| 在线看一区二区| 免费成人深夜小野草| 久久久精品2019中文字幕之3| 懂色一区二区三区免费观看| 有码一区二区三区| 6080yy午夜一二三区久久| 国产精一品亚洲二区在线视频| 亚洲欧洲99久久| 91精品久久久久久久91蜜桃| 国产成人日日夜夜| 亚洲制服欧美中文字幕中文字幕| 在线不卡一区二区| 国产美女娇喘av呻吟久久| 樱花草国产18久久久久| 制服丝袜国产精品| 成人免费视频国产在线观看| 一区二区三区四区在线免费观看| 欧美一区二区大片| 99久久婷婷国产| 日韩一区精品字幕| 国产精品家庭影院| 日韩亚洲欧美中文三级| 白白色 亚洲乱淫| 日本在线播放一区二区三区| 国产精品免费人成网站| 欧美一区二区三区在线| 成人免费视频一区二区| 日韩精品电影在线观看| 亚洲欧美一区二区三区国产精品 | 亚洲欧美另类小说| 精品国产免费一区二区三区香蕉| 色综合久久久久网| 国产九色精品成人porny| 性久久久久久久| 中文字幕永久在线不卡| 日韩免费看的电影| 欧美精品自拍偷拍| 91蜜桃视频在线| 福利视频网站一区二区三区| 一区二区三区美女视频| 欧美激情综合五月色丁香| 国产精品国产三级国产aⅴ无密码| 色婷婷综合久色| 国产精品一二三区| 久久精品久久综合| 首页国产欧美日韩丝袜| 亚洲精品欧美二区三区中文字幕| 久久精品亚洲一区二区三区浴池| 6080午夜不卡| 欧美色综合网站| 91老师片黄在线观看| 国产精品亚洲综合一区在线观看| 久久精品国内一区二区三区| 日韩一区精品视频| 天天av天天翘天天综合网色鬼国产 | 国产精品综合av一区二区国产馆| 午夜日韩在线电影| 亚洲一区二区三区美女| 亚洲日本成人在线观看| 国产精品三级视频| 国产欧美va欧美不卡在线| 精品久久国产老人久久综合| 欧美日韩国产欧美日美国产精品| 色婷婷综合五月| 一本色道综合亚洲| 欧洲国产伦久久久久久久| 91行情网站电视在线观看高清版| 99久久婷婷国产综合精品电影| 成人黄色av电影| 97久久精品人人做人人爽| 成人免费观看男女羞羞视频| 国产精品一区在线观看你懂的| 韩国理伦片一区二区三区在线播放 | 亚洲午夜av在线| 一区二区三区欧美久久| 亚洲一区二区三区自拍| 亚洲电影你懂得| 青草av.久久免费一区| 美女视频网站久久| 国产激情偷乱视频一区二区三区| 国产乱码精品1区2区3区| 国产高清不卡二三区| 国产成人精品一区二区三区网站观看 | 日韩欧美在线影院| 精品日韩一区二区三区| 久久婷婷一区二区三区| 国产欧美精品一区aⅴ影院| 国产精品初高中害羞小美女文| 亚洲欧美日韩国产手机在线| 亚洲国产日韩精品| 日韩国产欧美三级| 国内精品伊人久久久久av一坑| 成人性生交大合| 欧美亚洲动漫制服丝袜| 91精品婷婷国产综合久久竹菊| 26uuuu精品一区二区| 国产精品国产自产拍在线| 亚洲国产欧美在线| 久久99精品久久久久久久久久久久| 国内精品国产成人国产三级粉色| 成人精品国产福利| 91.成人天堂一区| 国产精品美女久久久久aⅴ| 午夜久久久久久久久| 国产九色sp调教91| 欧美日韩一区二区三区四区五区| 欧美mv和日韩mv国产网站| 国产嫩草影院久久久久| 亚洲国产综合91精品麻豆| 激情综合一区二区三区| 91成人免费电影| 精品国产一区二区精华| 亚洲欧美日韩国产中文在线| 蜜臀久久99精品久久久画质超高清 | 男女男精品视频| 不卡大黄网站免费看| 8v天堂国产在线一区二区| 欧美国产禁国产网站cc| 蜜乳av一区二区三区| av在线不卡免费看| 欧美tickling网站挠脚心| 亚洲一区二区三区自拍| 不卡区在线中文字幕|