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

唐吉訶德

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

常用鏈接

留言簿(2)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

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

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

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

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


1. 如果copy的物理地址在512M范圍內(nèi),那么由于靜態(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只能為物理地址,同時需要右移

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

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

Windows CE的有些函數(shù)中需要用到物理內(nèi)存結(jié)構(gòu)體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來代表物理地址,對于大多數(shù)32位的CPU而言,只需要把它的HighPart設(shè)置為0就可以了。

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

// 申請?zhí)摂M內(nèi)存

LPVOID VirtualAlloc(

 LPVOID lpAddress,     // 希望的虛擬內(nèi)存起始地址

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

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

 DWORD flProtect           // 訪問權(quán)限

);

// 把物理內(nèi)存綁定到虛擬地址空間

BOOL VirtualCopy(

 LPVOID lpvDest,           // 虛擬內(nèi)存的目標地址

 LPVOID lpvSrc,            // 物理內(nèi)存地址

 DWORD cbSize,             // 要綁定的大小

 DWORD fdwProtect          // 訪問權(quán)限

);

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

下面的代碼顯示了如何使用VirtualAllocVirtualCopy來訪問物理內(nèi)存。因為VirtualCopy負責(zé)把一段物理內(nèi)存和虛擬內(nèi)存綁定,所以VirtualAlloc的時候只需要對內(nè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用來把一段物理內(nèi)存直接映射到虛擬內(nèi)存。此函數(shù)的原形如下:

PVOID MmMapIoSpace(

 PHYSICAL_ADDRESS PhysicalAddress, // 起始物理地址

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

 BOOLEAN CacheEnable                   // 是否緩存

);

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

posted on 2011-03-01 17:37 心羽 閱讀(576) 評論(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>
            欧美一区二区三区久久精品茉莉花| 亚洲少妇中出一区| 一区二区欧美精品| 99视频+国产日韩欧美| 夜夜嗨av一区二区三区中文字幕| 在线观看日韩欧美| 亚洲国产日韩欧美| 亚洲狼人综合| 亚洲婷婷综合色高清在线| 亚洲国产婷婷| 亚洲第一区在线| 亚洲日韩第九十九页| 日韩一级免费观看| 亚洲欧美日韩一区二区在线| 久久精品女人的天堂av| 欧美激情精品久久久久久黑人| 亚洲精品免费一二三区| 一区二区三区www| 性欧美1819sex性高清| 久久亚洲国产精品日日av夜夜| 欧美日本乱大交xxxxx| 国产日韩专区在线| 亚洲精品久久久久久一区二区| 亚洲一区二区在线看| 久久综合伊人| 亚洲影视在线| 欧美激情亚洲精品| 国产性猛交xxxx免费看久久| 亚洲精品国产精品乱码不99按摩| 欧美一区二区三区四区高清 | 在线播放不卡| 亚洲午夜一区| 亚洲福利久久| 久久激五月天综合精品| 国产精品xxxxx| 亚洲人成人99网站| 久久午夜影视| 亚洲在线视频免费观看| 欧美精品久久99| 在线观看成人av电影| 欧美在线观看视频在线| 亚洲九九精品| 免费在线观看一区二区| 狠狠综合久久av一区二区小说| 亚洲午夜激情在线| 亚洲精品日本| 欧美精品一区二区三区很污很色的 | 亚洲欧美另类中文字幕| 亚洲高清免费| 乱人伦精品视频在线观看| 国产婷婷色一区二区三区四区| 亚洲一区国产精品| 亚洲最新视频在线| 欧美日韩国产在线播放网站| 在线日韩中文| 午夜精品三级视频福利| 欧美成人午夜剧场免费观看| 久久国产手机看片| 国内自拍一区| 久久久夜夜夜| 久久国产手机看片| 欧美一区二区女人| 国产精品久久福利| 亚洲欧美日韩国产综合| 一本色道久久综合亚洲精品不卡| 欧美日韩国产va另类| 99热免费精品| 在线视频精品| 欧美日韩91| 亚洲中无吗在线| 亚洲自拍偷拍色片视频| 国产精品一区毛片| 久久久成人精品| 欧美亚洲日本国产| 国产日本欧美一区二区三区在线 | 欧美一区二区三区在线视频| 亚洲欧美精品中文字幕在线| 亚洲美女电影在线| 国产精品美女久久| 久久成人精品一区二区三区| 午夜视频一区在线观看| 在线观看视频一区二区欧美日韩| 亚洲国产精品久久久久秋霞蜜臀| 欧美成黄导航| 午夜精品免费视频| 久久久精品动漫| 亚洲精品一区二区三区蜜桃久| 亚洲精品影视| 国产一区二区主播在线| 欧美高清不卡| 国产精品久久久久9999吃药| 久久久中精品2020中文| 久久久精品日韩欧美| 亚洲黄一区二区| 国产精品99久久久久久久女警| 韩国视频理论视频久久| 亚洲三级影院| 国产拍揄自揄精品视频麻豆| 久久一区二区三区av| 母乳一区在线观看| 欧美在线播放高清精品| 免费在线亚洲| 久久综合99re88久久爱| 欧美日韩喷水| 亚洲国产黄色片| 国内精品久久久久久久影视蜜臀| 亚洲精品1区2区| 激情久久综艺| 欧美岛国在线观看| 久久精品综合一区| 欧美日韩国产综合视频在线观看| 久久综合久久综合久久综合| 欧美剧在线观看| 久久深夜福利| 欧美日韩在线视频观看| 欧美成人免费小视频| 欧美人与性动交cc0o| 免费观看国产成人| 国产日韩欧美电影在线观看| 欧美激情久久久久| 亚洲高清色综合| 久久久av毛片精品| 久久gogo国模啪啪人体图| 欧美日韩第一区| 日韩视频免费看| 久久福利资源站| 亚洲欧美视频一区| 国产精品国产三级国产| 亚洲精品少妇网址| 亚洲欧洲一区二区三区在线观看| 性欧美超级视频| 欧美亚洲系列| 国产日产欧产精品推荐色| 亚洲国产精品电影| 在线观看国产一区二区| 久久精品欧美日韩精品| 欧美伊人精品成人久久综合97| 国产欧美一区二区精品忘忧草| 亚洲精品影院在线观看| 99v久久综合狠狠综合久久| 久久伊人亚洲| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美午夜精品久久久久免费视| 亚洲国产导航| 亚洲日本在线观看| 欧美激情日韩| 一区二区免费在线观看| 欧美亚洲午夜视频在线观看| 国产午夜精品一区二区三区视频| 久久高清免费观看| 欧美激情中文字幕一区二区| 亚洲人成在线影院| 欧美日韩国产综合在线| 99精品视频一区| 久久成人精品无人区| 亚洲国产成人在线视频| 欧美日韩国产精品一区| 亚洲永久视频| 蜜桃av久久久亚洲精品| 一本大道久久a久久精品综合| 欧美色视频一区| 欧美一区深夜视频| 欧美激情偷拍| 午夜精品福利视频| 1000部国产精品成人观看| 欧美精品1区2区| 亚洲综合色丁香婷婷六月图片| 久久午夜影视| 亚洲一区二区综合| 国内激情久久| 国产精品a久久久久久| 久久国产精品毛片| 日韩视频国产视频| 久久蜜桃av一区精品变态类天堂| 亚洲精品久久久久久久久久久久| 国产精品人人做人人爽| 另类天堂视频在线观看| 中文国产成人精品| 欧美+日本+国产+在线a∨观看| 亚洲午夜高清视频| 伊人久久大香线蕉综合热线| 欧美视频在线看| 噜噜噜在线观看免费视频日韩| 亚洲制服丝袜在线| 在线一区观看| 亚洲电影一级黄| 国产女人精品视频| 欧美伦理在线观看| 久久免费一区| 午夜精品一区二区三区在线视| 亚洲人成人一区二区三区| 久久人人爽人人爽| 亚洲免费视频网站| 亚洲精品一区二区三区在线观看| 国产日韩精品一区二区三区在线| 欧美美女日韩| 欧美精品一卡| 欧美激情精品久久久久久变态| 久久久www成人免费精品| 午夜激情久久久|