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

唐吉訶德

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  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時,位于用戶態的共享地址空間內(0x42000000-0x7E000000 )


1. 如果copy的物理地址在512M范圍內,那么由于靜態映射的存在,lpvSrc可以為靜態映射的虛擬地址,也可以為物理地址。采用后者需要指定page_physical,同時lpvSrc右移8位。
2. 如果copy的物理地址在512M范圍外,那么由于微軟的如下規定“
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負責把一段物理內存和虛擬內存綁定,這樣,最終對物理內存的訪問還是通過虛擬地址進行。它們的聲明如下:

// 申請虛擬內存

LPVOID VirtualAlloc(

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

 DWORD dwSize,             // 以字節為單位的大小

 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,                  // 要映射的字節數

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

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>
            蜜桃久久av一区| 一区二区电影免费在线观看| 中文一区在线| 久久精品视频在线观看| 欧美高清影院| 亚洲一区二区三区乱码aⅴ| 国产亚洲精品v| 欧美阿v一级看视频| 亚洲淫片在线视频| 91久久精品国产91性色tv| 亚洲一区在线免费观看| 在线播放亚洲一区| 欧美性猛片xxxx免费看久爱| 免费欧美日韩| 欧美一区二区免费视频| 夜夜嗨av一区二区三区四季av| 看片网站欧美日韩| 午夜精品福利视频| 日韩视频―中文字幕| 在线日韩电影| 国产婷婷色综合av蜜臀av| 欧美午夜精品理论片a级按摩| 麻豆av一区二区三区| 欧美一区二区视频97| 亚洲一区二区在线免费观看视频 | 亚洲一二三区精品| 免费不卡亚洲欧美| 久久免费视频在线| 午夜精品久久久久久久99热浪潮| 一区二区三区精品视频| 亚洲第一区在线观看| 在线日韩av片| 激情综合色丁香一区二区| 国产日韩亚洲欧美综合| 国产农村妇女毛片精品久久莱园子| 欧美激情中文不卡| 久久人人爽国产| 欧美在线免费看| 在线亚洲国产精品网站| 日韩亚洲精品在线| 亚洲精品一区在线| 亚洲精品国产拍免费91在线| 91久久线看在观草草青青| 亚洲国产日韩欧美在线99| 亚洲电影在线播放| 亚洲人成网站影音先锋播放| 一本色道久久精品| 亚洲无吗在线| 亚洲欧美日韩在线播放| 欧美伊人精品成人久久综合97| 欧美在线观看一区| 欧美高清在线播放| 欧美日韩高清一区| 久久一区二区精品| 欧美一区网站| 欧美一级淫片aaaaaaa视频| 午夜久久福利| 久久精品国产综合精品| 蜜桃av噜噜一区| 美腿丝袜亚洲色图| 99精品欧美| 午夜电影亚洲| 噜噜爱69成人精品| 欧美日韩国产精品| 国产一二三精品| 亚洲二区视频在线| 亚洲一区国产| 久久夜色精品国产欧美乱| 亚洲激情电影在线| 性欧美暴力猛交69hd| 欧美黄色影院| 国产日韩欧美91| 最新热久久免费视频| 午夜精品理论片| 农村妇女精品| 亚洲一区二区三区在线观看视频| 久久人91精品久久久久久不卡| 欧美日韩一区二区三区免费看| 韩国自拍一区| 中文国产成人精品| 欧美国产日韩一二三区| 亚洲欧美日韩视频一区| 欧美激情四色| 狠狠色综合色综合网络| 亚洲女优在线| 亚洲国产精品一区二区尤物区| 午夜精品福利一区二区三区av| 欧美激情中文不卡| 亚洲国产国产亚洲一二三| 欧美一区二区三区四区夜夜大片| 亚洲人成网在线播放| 久久婷婷人人澡人人喊人人爽| 国产精品久久久久影院色老大 | 欧美成年人视频网站| 国产精品影视天天线| 99国产精品久久久久久久久久| 鲁大师影院一区二区三区| 午夜精品久久久久久久| 国产精品久久久久三级| 在线中文字幕一区| 亚洲美女91| 欧美电影在线观看完整版| 亚洲国产国产亚洲一二三| 久久综合电影| 亚洲欧美卡通另类91av| 国产美女精品视频| 欧美一区二区三区电影在线观看| 美女视频黄 久久| 国产精品免费视频观看| 一区二区三区.www| 91久久久久久久久| 欧美第一黄网免费网站| 亚洲激情一区| 欧美国产精品一区| 久久久亚洲一区| 在线观看国产欧美| 免费久久99精品国产自| 久久一区二区三区四区五区| 精品动漫3d一区二区三区免费版 | 久久婷婷亚洲| 欧美日韩午夜激情| 一区二区三区高清在线观看| 亚洲一区中文| 91久久精品一区| 免费久久精品视频| 亚洲国产精品久久久久婷婷884| 久久乐国产精品| 欧美在线亚洲一区| 亚洲国产日韩欧美| 欧美国产精品一区| 欧美日韩成人在线| 欧美诱惑福利视频| 久久男人av资源网站| 日韩亚洲一区二区| 99国产麻豆精品| 国产精品久久看| 久久久久国产免费免费| 麻豆久久久9性大片| 一区二区三区四区蜜桃| 亚洲午夜久久久久久久久电影院| 国产精品爱啪在线线免费观看| 欧美在线观看视频一区二区| 久久gogo国模裸体人体| 日韩天天综合| 亚洲欧美日韩系列| 亚洲精品午夜精品| 亚洲午夜国产一区99re久久| 黄色国产精品| 亚洲福利视频一区二区| 欧美午夜无遮挡| 久久久久久婷| 欧美另类在线播放| 久久久久久9| 欧美黑人多人双交| 欧美一级在线亚洲天堂| 免费一级欧美在线大片| 欧美一区二区三区四区高清| 欧美成人国产一区二区| 亚洲欧美99| 久久久99爱| 欧美亚洲一区三区| 欧美理论大片| 免费日韩av片| 国产视频久久久久久久| 99热这里只有成人精品国产| 午夜精品久久久久影视 | 激情懂色av一区av二区av| 亚洲第一综合天堂另类专| 国产欧美一区二区精品秋霞影院| 亚洲高清二区| 国产一区二区三区四区在线观看 | 亚洲高清一二三区| 欧美体内she精视频| 欧美大片在线看免费观看| 国产日韩欧美视频在线| 亚洲最新在线| 亚洲精品美女在线观看播放| 香蕉久久夜色精品国产使用方法| 亚洲一区久久久| 欧美韩国在线| 久热精品在线视频| 国产日韩精品一区二区三区在线| 在线视频精品一| 一本色道久久加勒比精品| 男男成人高潮片免费网站| 欧美电影免费观看网站| 欧美国产日产韩国视频| 国产亚洲精品久久飘花| 午夜精品亚洲一区二区三区嫩草| 亚洲欧美国产va在线影院| 欧美日本在线一区| 91久久精品国产91久久| 亚洲日本在线观看| 欧美精品日韩综合在线| 亚洲欧洲日产国产综合网| 亚洲国产天堂网精品网站| 久久免费高清视频| 久久一本综合频道| 亚洲国产欧美日韩另类综合| 欧美成人免费观看|