青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

milkyway的窩

最初想法的誕生地

 

Windows CE下訪問(wèn)物理內(nèi)存的方法

嵌入式設(shè)備與桌面PC的一個(gè)顯著不同是它的應(yīng)用程序中通常需要直接訪問(wèn)某一段物理內(nèi)存,這在驅(qū)動(dòng)程序中對(duì)物理內(nèi)存的訪問(wèn)尤為重要,尤其是像ARM體系結(jié)構(gòu)下,I/O端口也被映射成某一個(gè)物理內(nèi)存地址。因此,與桌面版本W(wǎng)indows相比,Windows?CE提供了相對(duì)簡(jiǎn)單的物理內(nèi)存訪問(wèn)方式。無(wú)論是驅(qū)動(dòng)程序還是應(yīng)用程序都可以通過(guò)API訪問(wèn)某一段物理內(nèi)存。
Windows?CE的有些函數(shù)中需要用到物理內(nèi)存結(jié)構(gòu)體PHYSICAL_ADDRESS,?Windows?CE在ceddk.h中定義了PHYSICAL_ADDRESS,它其實(shí)是LARGE_INTEGER類型,其定義如下:
//?in?ceddk.h
typedef?LARGE_INTEGER?PHYSICAL_ADDRESS,?*PPHYSICAL_ADDRESS;
//?in?winnt.h
typedef?union?_LARGE_INTEGER{
??struct{
????DWORD?LowPart;
????LONG?HighPart;
??};
??LONGLONG?QuadPart;
}?LARGE_INTEGER;
可見(jiàn),Windows?CE中用64個(gè)Bit來(lái)代表物理地址,對(duì)于大多數(shù)32位的CPU而言,只需要把它的HighPart設(shè)置為0就可以了。
如果要直接訪問(wèn)某一個(gè)地址的物理內(nèi)存,Windows?CE提供了VirtualAlloc()和VirtualCopy()函數(shù),VirtualAlloc負(fù)責(zé)在虛擬內(nèi)存空間內(nèi)保留一段虛擬內(nèi)存,而VirtualCopy負(fù)責(zé)把一段物理內(nèi)存和虛擬內(nèi)存綁定,這樣,最終對(duì)物理內(nèi)存的訪問(wèn)還是通過(guò)虛擬地址進(jìn)行。它們的聲明如下:
//?申請(qǐng)?zhí)摂M內(nèi)存
LPVOID?VirtualAlloc(
??LPVOID?lpAddress,?????????//?希望的虛擬內(nèi)存起始地址
??DWORD?dwSize,?????????????????//?以字節(jié)為單位的大小
??DWORD?flAllocationType,?????//?申請(qǐng)類型,分為Reserve和Commit
??DWORD?flProtect?????????????//?訪問(wèn)權(quán)限
);
//?把物理內(nèi)存綁定到虛擬地址空間
BOOL?VirtualCopy(?
??LPVOID?lpvDest,?????????????//?虛擬內(nèi)存的目標(biāo)地址
??LPVOID?lpvSrc,?????????????//?物理內(nèi)存地址
??DWORD?cbSize,?????????????????//?要綁定的大小
??DWORD?fdwProtect?????????????//?訪問(wèn)權(quán)限
);
VirtualAlloc對(duì)虛擬內(nèi)存的申請(qǐng)分為兩步,保留MEM_RESERVE和提交MEM_COMMIT。其中MEM_RESERVE只是在進(jìn)程的虛擬地址空間內(nèi)保留一段,并不分配實(shí)際的物理內(nèi)存,因此保留的虛擬內(nèi)存并不能被應(yīng)用程序直接使用。MEM_COMMIT階段才真正的為虛擬內(nèi)存分配物理內(nèi)存。
下面的代碼顯示了如何使用VirtualAlloc和VirtualCopy來(lái)訪問(wèn)物理內(nèi)存。因?yàn)閂irtualCopy負(fù)責(zé)把一段物理內(nèi)存和虛擬內(nèi)存綁定,所以VirtualAlloc的時(shí)候只需要對(duì)內(nèi)存保留,沒(méi)有必要提交。
FpDriverGlobals?=?
(PDRIVER_GLOBALS)?VirtualAlloc(
????0,?
????DRIVER_GLOBALS_PHYSICAL_MEMORY_SIZE,?
????MEM_RESERVE,?
????PAGE_NOACCESS);
?if?(FpDriverGlobals?==?NULL)?{
????ERRORMSG(DRIVER_ERROR_MSG,?(TEXT("?VirtualAlloc?failed!\r\n")));
????return;
?}
?else?{
????if?(!VirtualCopy(
????(PVOID)FpDriverGlobals,?
????(PVOID)(DRIVER_GLOBALS_PHYSICAL_MEMORY_START),?
????DRIVER_GLOBALS_PHYSICAL_MEMORY_SIZE,?
????(PAGE_READWRITE?|?PAGE_NOCACHE)))?{
???????ERRORMSG(DRIVER_ERROR_MSG,?(TEXT("VirtualCopy?failed!\r\n")));
???????return;
????}
?}
CEDDK還提供了函數(shù)MmMapIoSpace用來(lái)把一段物理內(nèi)存直接映射到虛擬內(nèi)存。用MmMapIoSpace申請(qǐng)的內(nèi)存要用MmUnmapIoSpace釋放,此函數(shù)的原形如下:
PVOID?MmMapIoSpace(?
??PHYSICAL_ADDRESS?PhysicalAddress,?????//?起始物理地址
??ULONG?NumberOfBytes,?????????????????????//?要映射的字節(jié)數(shù)
??BOOLEAN?CacheEnable?????????????????????//?是否緩存
);

VOID?MmUnmapIoSpace(?
??PVOID?BaseAddress,?????????????????????//?MmMapIoSpace返回的起始虛擬地址
??ULONG?NumberOfBytes?????????????????????//?
);
其實(shí),MmMapIoSpace函數(shù)內(nèi)部也是調(diào)用VirtualAlloc和VirtualCopy函數(shù)來(lái)實(shí)現(xiàn)物理地址到虛擬地址的映射的。MmMapIoSpace函數(shù)的原代碼是公開(kāi)的,我們可以從%_WINCEROOT%\PUBLIC\COMMON\OAK\DRIVERS\CEDDK\DDK_MAP\ddk_map.c得到。從MmMapIoSpace的實(shí)現(xiàn)我們也可以看出VirtualAlloc和VirtualCopy的用法:
PVOID?MmMapIoSpace?(
????IN?PHYSICAL_ADDRESS?PhysicalAddress,
????IN?ULONG?NumberOfBytes,
????IN?BOOLEAN?CacheEnable
????)
{
PVOID?pVirtualAddress;?ULONGLONG?SourcePhys;?
ULONG?SourceSize;?BOOL?bSuccess;

????SourcePhys?=?PhysicalAddress.QuadPart?&?~(PAGE_SIZE?-?1);
????SourceSize?=?NumberOfBytes?+?(PhysicalAddress.LowPart?&?(PAGE_SIZE?-?1));

????pVirtualAddress?=?VirtualAlloc(0,?SourceSize,?MEM_RESERVE,?PAGE_NOACCESS);
????if?(pVirtualAddress?!=?NULL)
????{
????????bSuccess?=?VirtualCopy(
????????????pVirtualAddress,?(PVOID)(SourcePhys?>>?8),?SourceSize,
????????????PAGE_PHYSICAL?|?PAGE_READWRITE?|?(CacheEnable???0?:?PAGE_NOCACHE));

????????if?(bSuccess)?{
????????????(ULONG)pVirtualAddress?+=?PhysicalAddress.LowPart?&?(PAGE_SIZE?-?1);
????????}
????????else?{
????????????VirtualFree(pVirtualAddress,?0,?MEM_RELEASE);
????????????pVirtualAddress?=?NULL;
????????}
????}
????return?pVirtualAddress;
}
此外,Windows?CE還供了AllocPhysMem函數(shù)和FreePhysMem函數(shù),用來(lái)申請(qǐng)和釋放一段連續(xù)的物理內(nèi)存。函數(shù)可以保證申請(qǐng)的物理內(nèi)存是連續(xù)的,如果函數(shù)成功,會(huì)返回虛擬內(nèi)存的句柄和物理內(nèi)存的起始地址。這對(duì)于DMA設(shè)備尤為有用。在這里就不詳細(xì)介紹了,讀者可以參考Windows?CE的聯(lián)機(jī)文檔。

posted on 2007-02-02 09:25 milkyway 閱讀(2823) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


導(dǎo)航

統(tǒng)計(jì)

公告

隨筆皆原創(chuàng),文章乃轉(zhuǎn)載. 歡迎留言!

常用鏈接

留言簿(37)

隨筆分類(104)

隨筆檔案(101)

文章分類(51)

文章檔案(53)

wince牛人

搜索

積分與排名

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            在线一区二区日韩| 一区二区在线不卡| 欧美一区不卡| 欧美在线一区二区三区| 久久精品国产第一区二区三区| 久久av红桃一区二区小说| 久久精品国产免费| 欧美阿v一级看视频| 欧美三级免费| 国产日韩欧美在线播放不卡| 伊人男人综合视频网| 99pao成人国产永久免费视频| 亚洲综合成人婷婷小说| 久久中文在线| 一级成人国产| 久热爱精品视频线路一| 国产精品国产a级| 亚洲高清久久| 欧美中文字幕视频| 亚洲精品影院| 久久久久久久成人| 国产精品视频一区二区三区| 91久久久久久久久| 久久久久国产精品麻豆ai换脸| 亚洲激情在线视频| 亚洲视频在线观看免费| 久久久亚洲高清| 国产精品视频在线观看| 亚洲精品日产精品乱码不卡| 欧美尤物巨大精品爽| 亚洲靠逼com| 久久夜色精品一区| 国产日韩在线视频| 亚洲视频日本| 亚洲高清久久| 久久精品国产2020观看福利| 国产精品毛片高清在线完整版| 亚洲黄色影片| 欧美三级电影一区| 亚洲国产精品成人久久综合一区| 亚洲日本在线观看| 玖玖玖免费嫩草在线影院一区| 一区二区黄色| 欧美高清视频在线观看| 极品少妇一区二区三区| 亚洲欧美日韩国产综合在线| 亚洲欧洲在线视频| 久久综合五月天婷婷伊人| 国产日本欧美一区二区三区在线| 亚洲一区二区免费看| 亚洲国产色一区| 久热国产精品| 亚洲高清自拍| 欧美成人久久| 蜜桃久久精品乱码一区二区| 黄色av日韩| 六十路精品视频| 久久夜色精品国产欧美乱| 影音先锋久久| 免费影视亚洲| 欧美大片免费久久精品三p | 国产精品久久777777毛茸茸| 亚洲毛片在线看| 亚洲精品久久久久久一区二区| 欧美巨乳在线| 一区二区三区视频免费在线观看 | 久久男女视频| 亚洲福利视频一区| 欧美激情一区二区三区| 欧美高清影院| 亚洲愉拍自拍另类高清精品| 亚洲色图自拍| 国产一区二区三区视频在线观看| 久久嫩草精品久久久久| 久久亚洲精品网站| 亚洲精品在线视频| 亚洲无亚洲人成网站77777| 国产女同一区二区| 欧美不卡福利| 欧美三日本三级三级在线播放| 西瓜成人精品人成网站| 久久男人资源视频| 一卡二卡3卡四卡高清精品视频| 一区二区电影免费观看| 国产精品一区免费观看| 久热精品视频| 欧美午夜精品理论片a级按摩| 久久精品国产久精国产一老狼| 久久天天躁狠狠躁夜夜爽蜜月| 日韩一级免费| 欧美在线观看www| 99re热精品| 欧美一区二区播放| 99视频精品全国免费| 午夜精品久久久久久久蜜桃app | 国产性做久久久久久| 久久一区二区三区四区五区| 欧美黑人国产人伦爽爽爽| 亚洲欧美第一页| 麻豆精品精华液| 亚洲欧美清纯在线制服| 久久在线免费视频| 性欧美暴力猛交69hd| 欧美激情亚洲精品| 久久国产精品久久久久久电车| 美女精品国产| 久久精品国产亚洲a| 欧美视频1区| 亚洲第一精品福利| 国产亚洲欧美日韩日本| 一本久久a久久精品亚洲| 91久久亚洲| 久久久久久久久蜜桃| 欧美一区二区三区视频在线| 欧美日韩一区二区三区在线观看免| 裸体女人亚洲精品一区| 国产精品久久久久国产精品日日| 亚洲成色777777在线观看影院| 国产私拍一区| 亚洲一区二区三区四区在线观看 | 欧美aaa级| 国内精品久久久久久影视8| 亚洲小说区图片区| 99精品热视频| 欧美激情精品久久久久久黑人| 美女精品自拍一二三四| 激情一区二区| 欧美在线播放| 久久综合给合久久狠狠狠97色69| 国产日产高清欧美一区二区三区| 亚洲视频成人| 性久久久久久久久| 国产精品一区二区久久精品| 亚洲一区久久久| 香蕉久久夜色精品国产使用方法| 国产精品久久77777| 亚洲在线播放电影| 欧美在线|欧美| 国产欧美日韩综合一区在线观看 | 99精品视频免费全部在线| 99国产精品99久久久久久| 欧美黄色精品| 日韩视频久久| 午夜亚洲福利| 国产亚洲欧美另类中文| 久久精品一级爱片| 亚洲成人资源| 亚洲一区二区三区精品动漫| 国产精品视频第一区| 午夜国产精品影院在线观看| 久久久久天天天天| 亚洲日本激情| 国产精品大片| 欧美在线视频观看| 欧美国产日韩一区| 亚洲一区二区三区精品在线观看 | 国产专区欧美专区| 久久久久久久久久久成人| 欧美国产欧美综合| 一区二区三区精品国产| 国产欧美日韩免费| 免费人成精品欧美精品| 99精品热视频| 久久久精品tv| 99在线观看免费视频精品观看| 国产精品久久久久久久电影| 欧美在线999| 亚洲毛片播放| 久久久99久久精品女同性| 亚洲激情一区二区三区| 欧美日韩一区在线播放| 久久精品国产第一区二区三区最新章节| 欧美激情一区二区三级高清视频| 亚洲一区精彩视频| 在线看日韩av| 国产欧美一区二区精品性色| 欧美福利视频网站| 午夜久久久久| 亚洲精品精选| 每日更新成人在线视频| 亚洲在线播放电影| 亚洲黄色成人久久久| 国产欧美日韩高清| 欧美视频日韩视频| 免费成人性网站| 香蕉视频成人在线观看| 亚洲美女福利视频网站| 美日韩免费视频| 久久国产精品高清| 亚洲视频日本| 一区二区高清在线观看| 亚洲黄色天堂| 在线观看av不卡| 国产亚洲日本欧美韩国| 国产精品普通话对白| 欧美日韩黄色大片| 欧美大片在线影院| 免费成人美女女| 久久综合中文字幕| 久久夜色精品|