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

milkyway的窩

最初想法的誕生地

 

Windows CE下訪問物理內存的方法

嵌入式設備與桌面PC的一個顯著不同是它的應用程序中通常需要直接訪問某一段物理內存,這在驅動程序中對物理內存的訪問尤為重要,尤其是像ARM體系結構下,I/O端口也被映射成某一個物理內存地址。因此,與桌面版本Windows相比,Windows?CE提供了相對簡單的物理內存訪問方式。無論是驅動程序還是應用程序都可以通過API訪問某一段物理內存。
Windows?CE的有些函數中需要用到物理內存結構體PHYSICAL_ADDRESS,?Windows?CE在ceddk.h中定義了PHYSICAL_ADDRESS,它其實是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;
可見,Windows?CE中用64個Bit來代表物理地址,對于大多數32位的CPU而言,只需要把它的HighPart設置為0就可以了。
如果要直接訪問某一個地址的物理內存,Windows?CE提供了VirtualAlloc()和VirtualCopy()函數,VirtualAlloc負責在虛擬內存空間內保留一段虛擬內存,而VirtualCopy負責把一段物理內存和虛擬內存綁定,這樣,最終對物理內存的訪問還是通過虛擬地址進行。它們的聲明如下:
//?申請虛擬內存
LPVOID?VirtualAlloc(
??LPVOID?lpAddress,?????????//?希望的虛擬內存起始地址
??DWORD?dwSize,?????????????????//?以字節為單位的大小
??DWORD?flAllocationType,?????//?申請類型,分為Reserve和Commit
??DWORD?flProtect?????????????//?訪問權限
);
//?把物理內存綁定到虛擬地址空間
BOOL?VirtualCopy(?
??LPVOID?lpvDest,?????????????//?虛擬內存的目標地址
??LPVOID?lpvSrc,?????????????//?物理內存地址
??DWORD?cbSize,?????????????????//?要綁定的大小
??DWORD?fdwProtect?????????????//?訪問權限
);
VirtualAlloc對虛擬內存的申請分為兩步,保留MEM_RESERVE和提交MEM_COMMIT。其中MEM_RESERVE只是在進程的虛擬地址空間內保留一段,并不分配實際的物理內存,因此保留的虛擬內存并不能被應用程序直接使用。MEM_COMMIT階段才真正的為虛擬內存分配物理內存。
下面的代碼顯示了如何使用VirtualAlloc和VirtualCopy來訪問物理內存。因為VirtualCopy負責把一段物理內存和虛擬內存綁定,所以VirtualAlloc的時候只需要對內存保留,沒有必要提交。
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還提供了函數MmMapIoSpace用來把一段物理內存直接映射到虛擬內存。用MmMapIoSpace申請的內存要用MmUnmapIoSpace釋放,此函數的原形如下:
PVOID?MmMapIoSpace(?
??PHYSICAL_ADDRESS?PhysicalAddress,?????//?起始物理地址
??ULONG?NumberOfBytes,?????????????????????//?要映射的字節數
??BOOLEAN?CacheEnable?????????????????????//?是否緩存
);

VOID?MmUnmapIoSpace(?
??PVOID?BaseAddress,?????????????????????//?MmMapIoSpace返回的起始虛擬地址
??ULONG?NumberOfBytes?????????????????????//?
);
其實,MmMapIoSpace函數內部也是調用VirtualAlloc和VirtualCopy函數來實現物理地址到虛擬地址的映射的。MmMapIoSpace函數的原代碼是公開的,我們可以從%_WINCEROOT%\PUBLIC\COMMON\OAK\DRIVERS\CEDDK\DDK_MAP\ddk_map.c得到。從MmMapIoSpace的實現我們也可以看出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函數和FreePhysMem函數,用來申請和釋放一段連續的物理內存。函數可以保證申請的物理內存是連續的,如果函數成功,會返回虛擬內存的句柄和物理內存的起始地址。這對于DMA設備尤為有用。在這里就不詳細介紹了,讀者可以參考Windows?CE的聯機文檔。

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


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導航

統計

公告

隨筆皆原創,文章乃轉載. 歡迎留言!

常用鏈接

留言簿(37)

隨筆分類(104)

隨筆檔案(101)

文章分類(51)

文章檔案(53)

wince牛人

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一本色道久久综合亚洲91| 精品不卡在线| 亚洲激情在线| 欧美国产91| 午夜宅男久久久| 久久成人免费电影| 欧美一区二区在线看| 亚洲欧美综合国产精品一区| 欧美在线免费视屏| 一区二区三区在线免费播放| 欧美裸体一区二区三区| 99视频在线精品国自产拍免费观看 | 国产伦理一区| 黄色成人av网| 亚洲人成在线观看| 亚洲免费在线看| 欧美中文日韩| 亚洲国产精品毛片| 一区二区成人精品| 欧美在线视频观看| 欧美日韩一区综合| 黄色工厂这里只有精品| 宅男噜噜噜66一区二区| 久热精品视频在线观看| 一本久久综合| 久久亚洲精品一区二区| 国产精品国产三级国产aⅴ入口| 黑丝一区二区| 亚洲香蕉伊综合在人在线视看| 久久久久久九九九九| 日韩午夜在线电影| 免费成人激情视频| 狠狠干成人综合网| 欧美在线www| 在线亚洲伦理| 欧美连裤袜在线视频| 亚洲成色www8888| 久久福利精品| 亚洲私拍自拍| 欧美日韩一区不卡| 亚洲日韩视频| 欧美成人性网| 久久久久久夜| 国产综合在线看| 欧美一区亚洲| 亚洲午夜在线观看| 国产精品v欧美精品v日韩 | 亚洲三级视频在线观看| 久久久久国产精品一区| 午夜精品在线看| 欧美日韩亚洲天堂| 亚洲乱码久久| 亚洲另类春色国产| 欧美日韩国产在线一区| 日韩视频一区二区| 最新中文字幕一区二区三区| 老司机免费视频一区二区三区| 国产一区久久| 免费久久久一本精品久久区| 久久视频国产精品免费视频在线| 国产在线一区二区三区四区| 美脚丝袜一区二区三区在线观看 | 久久婷婷丁香| 欧美一区三区二区在线观看| 国产三级精品在线不卡| 久久精品视频在线观看| 久久精品首页| 亚洲国产乱码最新视频| 亚洲高清资源| 欧美日韩亚洲一区| 欧美亚洲视频在线观看| 久久福利精品| 亚洲日韩视频| 亚洲午夜在线视频| 国产一区美女| 欧美激情小视频| 欧美色综合网| 久久久www成人免费无遮挡大片| 久久精品一区二区三区中文字幕| 91久久香蕉国产日韩欧美9色| 亚洲九九爱视频| 国产日韩综合| 亚洲级视频在线观看免费1级| 欧美日韩综合视频| 久久精品国产综合精品| 欧美大尺度在线| 亚洲欧美一区二区激情| 久久久99精品免费观看不卡| 99精品久久久| 久久精品成人| 亚洲裸体在线观看| 欧美一区二区三区免费大片| 亚洲国产精品一区二区www在线 | 欧美777四色影视在线| 欧美激情一二三区| 久久精品国产视频| 欧美日韩mv| 美女黄网久久| 国产精品你懂的在线欣赏| 免费成人在线观看视频| 欧美视频亚洲视频| 米奇777在线欧美播放| 欧美日韩岛国| 久久久国产91| 欧美不卡一卡二卡免费版| 欧美一区二区精品久久911| 欧美国产在线电影| 久久人人爽人人爽爽久久| 欧美日韩免费观看一区| 欧美成人精品在线| 国产午夜久久久久| 在线综合亚洲欧美在线视频| 久久精品国产99国产精品澳门| 99re成人精品视频| 欧美一区影院| 午夜精品久久久久久久久久久| 久久综合九色| 久久蜜桃香蕉精品一区二区三区| 免费在线播放第一区高清av| 亚洲欧美日韩精品在线| 欧美丰满高潮xxxx喷水动漫| 久久久久久久综合日本| 欧美午夜女人视频在线| 亚洲高清视频在线| 在线观看亚洲专区| 久久久久久久综合| 免费不卡在线观看av| 国产欧美高清| 亚洲一区成人| 亚洲摸下面视频| 国产精品vvv| 亚洲一区二区三区成人在线视频精品| 99精品视频免费在线观看| 欧美成人精品三级在线观看| 亚洲电影有码| 妖精视频成人观看www| 欧美激情亚洲另类| 亚洲精品一二三区| 亚洲制服av| 国产日韩精品久久| 久久精品国产亚洲精品| 久久婷婷久久| 在线电影院国产精品| 免费观看在线综合色| 欧美顶级少妇做爰| 在线综合视频| 午夜精品影院| 嫩草伊人久久精品少妇av杨幂| 亚洲电影在线| 欧美日韩成人| 亚洲午夜精品网| 久久精品视频播放| 亚洲欧洲精品一区二区| 欧美日韩一区三区| 欧美一区二区三区精品电影| 欧美α欧美αv大片| 一区二区三区国产精品| 国产精品黄色| 久久激情网站| 亚洲高清资源| 欧美一二三区在线观看| 精品av久久久久电影| 欧美日本免费| 欧美亚洲综合久久| 亚洲第一综合天堂另类专| 亚洲一本视频| 狠狠色噜噜狠狠色综合久| 欧美成人综合一区| 欧美一级视频| 亚洲国产一成人久久精品| 午夜久久久久久| 亚洲人久久久| 国产日韩精品电影| 欧美日韩国产成人高清视频| 午夜精品久久久久久久白皮肤| 亚洲大片精品永久免费| 久久精品国产综合| 亚洲性夜色噜噜噜7777| 亚洲黄色成人| 国语自产精品视频在线看一大j8| 欧美色图麻豆| 欧美成人中文| 久久久人成影片一区二区三区观看| 一区二区三区波多野结衣在线观看| 欧美成人免费在线视频| 久久精品国产精品| 亚洲永久在线| 亚洲天堂成人在线观看| 亚洲激情视频在线| 久久久久成人精品免费播放动漫| 国产视频不卡| 欧美另类高清视频在线| 久久精品国产综合精品| 亚洲一区综合| 亚洲精品一区二区三区蜜桃久| 蜜桃久久精品乱码一区二区| 久久成人综合网| 久久se精品一区二区| 亚洲综合视频1区| 亚洲伊人第一页|