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

唐吉訶德

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  5 Posts :: 75 Stories :: 3 Comments :: 0 Trackbacks

常用鏈接

留言簿(2)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

1.VirtualAlloc用來在進程的虛擬地址空間中保留(reserve)或者提交(commit)頁。在保留時以64KB為粒度,即保留空間以64K為單位。而提交虛擬地址時,則以頁(典型大小為4KB)為單位。

2.VirtualCopy用來綁定一塊物理內存到當前進程虛擬地址空間。參數里的lpvSrc既可以是內核段的虛擬地址也可以是物理地址(用page_physical來標記)。同時要注意lpvSrc的右移與否。

3.使用VirtualAlloc要包含Winbase.h;使用VirtualCopy時要包含plfuncs.h.兩者都要鏈接coredll.lib.

4.在CE5.0之前,使用VirtualAlloc獲得的虛擬地址空間分為兩種情形:
(1)大小在2MB以下時,位于調用進程的虛擬空間中;
(2)大小大于2MB時,位于用戶態(tài)的共享地址空間內(0x42000000-0x7E000000 )


1. 如果copy的物理地址在512M范圍內,那么由于靜態(tài)映射的存在,lpvSrc可以為靜態(tài)映射的虛擬地址,也可以為物理地址。采用后者需要指定page_physical,同時lpvSrc右移8位。
2. 如果copy的物理地址在512M范圍外,那么由于微軟的如下規(guī)定“
VirtualCopy also supports the PAGE_PHYSICAL flag. You must set this flag when you are mapping physical memory that resides beyond 512 MB, that is, physical memory with an address above 0x1FFFFFFF.”
lpvSrc只能為物理地址,同時需要右移

只要設置了PAGE_PHYSICAL 為真,那么就需要把lpvSrc右移8位

嵌入式設備與桌面
PC的一個顯著不同是它的應用程序中通常需要直接訪問某一段物理內存,這在驅動程序中對物理內存的訪問尤為重要,尤其是像ARM體系結構下,I/O端口也被映射成某一個物理內存地址。因此,與桌面版本Windows相比,Windows CE提供了相對簡單的物理內存訪問方式。無論是驅動程序還是應用程序都可以通過API訪問某一段物理內存。

Windows CE的有些函數中需要用到物理內存結構體PHYSICAL_ADDRESS Windows CEceddk.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中用64Bit來代表物理地址,對于大多數32位的CPU而言,只需要把它的HighPart設置為0就可以了。

如果要直接訪問某一個地址的物理內存,Windows CE提供了VirtualAlloc()VirtualCopy()函數,VirtualAlloc負責在虛擬內存空間內保留一段虛擬內存,而VirtualCopy負責把一段物理內存和虛擬內存綁定,這樣,最終對物理內存的訪問還是通過虛擬地址進行。它們的聲明如下:

// 申請?zhí)摂M內存

LPVOID VirtualAlloc(

 LPVOID lpAddress,     // 希望的虛擬內存起始地址

 DWORD dwSize,             // 以字節(jié)為單位的大小

 DWORD flAllocationType,  // 申請類型,分為ReserveCommit

 DWORD flProtect           // 訪問權限

);

// 把物理內存綁定到虛擬地址空間

BOOL VirtualCopy(

 LPVOID lpvDest,           // 虛擬內存的目標地址

 LPVOID lpvSrc,            // 物理內存地址

 DWORD cbSize,             // 要綁定的大小

 DWORD fdwProtect          // 訪問權限

);

VirtualAlloc對虛擬內存的申請分為兩步,保留MEM_RESERVE和提交MEM_COMMIT。其中MEM_RESERVE只是在進程的虛擬地址空間內保留一段,并不分配實際的物理內存,因此保留的虛擬內存并不能被應用程序直接使用。MEM_COMMIT階段才真正的為虛擬內存分配物理內存。

下面的代碼顯示了如何使用VirtualAllocVirtualCopy來訪問物理內存。因為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用來把一段物理內存直接映射到虛擬內存。此函數的原形如下:

PVOID MmMapIoSpace(

 PHYSICAL_ADDRESS PhysicalAddress, // 起始物理地址

 ULONG NumberOfBytes,                  // 要映射的字節(jié)數

 BOOLEAN CacheEnable                   // 是否緩存

);

其實,MmMapIoSpace函數內部也是調用VirtualAllocVirtualCopy函數來實現物理地址到虛擬地址的映射的。MmMapIoSpace函數的原代碼是公開的,我們可以從%_WINCEROOT%\PUBLIC\COMMON\OAK\DRIVERS\CEDDK\DDK_MAP\ddk_map.c得到。從MmMapIoSpace的實現我們也可以看出VirtualAllocVirtualCopy的用法:

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函數,用來申請和釋放一段連續(xù)的物理內存。函數可以保證申請的物理內存是連續(xù)的,如果函數成功,會返回虛擬內存的句柄和物理內存的起始地址。這對于DMA設備尤為有用。在這里就不詳細介紹了,讀者可以參考Windows CE的聯(lián)機文檔。

posted on 2011-03-01 17:37 心羽 閱讀(587) 評論(0)  編輯 收藏 引用 所屬分類: 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>
            亚洲毛片在线免费观看| 日韩视频免费观看| 国产精品久久久久久五月尺| 老司机精品福利视频| 国产精品视频精品| 日韩亚洲成人av在线| 亚洲福利视频网| 欧美亚洲专区| 欧美一区二区视频在线观看2020 | 在线综合+亚洲+欧美中文字幕| 好吊一区二区三区| 午夜亚洲精品| 欧美一区二粉嫩精品国产一线天| 欧美日韩精品一区二区| 欧美激情视频在线播放| 一区二区三区中文在线观看 | 亚欧成人精品| 午夜国产一区| 国产精品国产福利国产秒拍| 亚洲精品一区二区网址| 亚洲精品免费在线| 美女被久久久| 欧美激情一区二区三区| 亚洲日韩欧美一区二区在线| 免费短视频成人日韩| 欧美成人综合网站| 亚洲高清久久网| 免费成人美女女| 亚洲国产精品久久久久| 亚洲韩国青草视频| 欧美国产精品劲爆| 亚洲破处大片| 亚洲一区网站| 国产嫩草一区二区三区在线观看| 亚洲免费一在线| 久久国产精品高清| 好吊成人免视频| 欧美成人性网| 日韩性生活视频| 午夜亚洲福利| 精品1区2区3区4区| 欧美1区2区3区| 亚洲伦伦在线| 欧美亚洲三区| 激情视频一区二区| 欧美日韩福利视频| 亚洲欧美国产高清va在线播| 久久久综合网| 日韩视频精品| 国产伦精品一区二区三区视频黑人| 午夜精品久久久久久久白皮肤| 麻豆精品在线播放| 夜夜嗨av一区二区三区| 国产乱理伦片在线观看夜一区| 久久精品视频亚洲| 亚洲精品免费观看| 久久国产精品久久w女人spa| 亚洲激情综合| 国产女人18毛片水18精品| 另类成人小视频在线| 一区二区三区精品视频| 久久久爽爽爽美女图片| 夜夜爽夜夜爽精品视频| 国产精品入口日韩视频大尺度| 久久精品九九| 一区二区三区精品视频在线观看| 久久久亚洲高清| 在线视频中文亚洲| 一区二区三区在线视频观看| 欧美视频一二三区| 乱码第一页成人| 亚洲自拍偷拍视频| 亚洲国产精品久久久久秋霞蜜臀| 欧美有码在线观看视频| 亚洲理论在线观看| 激情av一区二区| 国产精品福利在线观看| 麻豆91精品91久久久的内涵| 亚洲免费在线视频| 亚洲精品专区| 男女精品网站| 久久国产主播精品| 亚洲无人区一区| 亚洲日本中文字幕区| 国外成人在线视频网站| 国产精品国产三级国产a| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲午夜在线观看视频在线| ●精品国产综合乱码久久久久| 国产精品欧美一区喷水| 欧美日韩精品免费观看视频| 麻豆国产va免费精品高清在线| 久久成人国产| 先锋影音网一区二区| 亚洲一二三区在线| 亚洲色图自拍| 99精品福利视频| 日韩视频中午一区| 亚洲日本国产| 亚洲精品麻豆| 亚洲精品在线二区| 亚洲欧洲一二三| 亚洲欧洲在线免费| 亚洲欧洲精品天堂一级| 亚洲国产精品日韩| 亚洲福利免费| 亚洲国产精品女人久久久| 亚洲第一精品影视| 亚洲欧洲一二三| 亚洲国产欧美一区二区三区久久 | 欧美精品在线看| 欧美精品七区| 欧美日韩一区二区免费在线观看 | 国产精品国产三级国产a| 欧美吻胸吃奶大尺度电影| 欧美日韩一区二区高清| 国产精品美女一区二区在线观看 | 欧美日韩大片| 国产精品福利在线观看| 国产精品丝袜久久久久久app | 国产精品女人毛片| 国产日韩欧美三级| 在线播放国产一区中文字幕剧情欧美| 黑丝一区二区| 亚洲人成网站999久久久综合| 日韩视频一区二区在线观看| 99精品福利视频| 亚洲综合清纯丝袜自拍| 欧美中文字幕| 欧美1级日本1级| 亚洲免费av片| 午夜免费久久久久| 久热精品视频在线| 欧美精品一区二区三区在线播放 | 久久久久88色偷偷免费| 蜜臀99久久精品久久久久久软件| 欧美a一区二区| 99精品国产福利在线观看免费 | 久久精品道一区二区三区| 麻豆成人在线观看| 国产精品爱久久久久久久| 激情懂色av一区av二区av| 日韩小视频在线观看| 午夜精品视频在线| 欧美激情 亚洲a∨综合| 亚洲特色特黄| 久热精品视频在线免费观看| 欧美小视频在线观看| 在线观看日韩av电影| 亚洲欧美日韩一区二区在线| 蜜桃久久av一区| 中文一区二区| 免费成人高清| 国产一区二区三区直播精品电影| 亚洲精品永久免费| 久久经典综合| 在线视频精品一| 美女任你摸久久| 国产区精品在线观看| 夜夜爽99久久国产综合精品女不卡 | 亚洲全部视频| 久久国产精品99国产| 国产精品v一区二区三区| 亚洲黄色在线看| 久久久久国产精品人| 日韩一级精品| 欧美成人精品一区二区| 国产一区欧美| 性欧美激情精品| 日韩一区二区精品葵司在线| 久久在线91| 合欧美一区二区三区| 午夜在线视频一区二区区别| 亚洲人成在线免费观看| 麻豆精品网站| 在线观看欧美亚洲| 久久精品九九| 欧美一级视频免费在线观看| 欧美色区777第一页| 日韩西西人体444www| 欧美激情影音先锋| 久久综合中文字幕| 韩国一区二区在线观看| 久久精品一二三区| 亚洲欧美日韩国产中文| 国产精品久久久久久av下载红粉 | 欧美人与禽性xxxxx杂性| 亚洲电影第三页| 免费一级欧美片在线播放| 欧美综合77777色婷婷| 国产亚洲制服色| 久久久一区二区| 久久九九精品99国产精品| 国产一区二区无遮挡| 久久成人精品一区二区三区| 亚洲中无吗在线| 国产视频不卡| 久久久国产精彩视频美女艺术照福利| 亚洲欧美激情视频| 国内成人精品2018免费看|