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

隨筆 - 74, 文章 - 0, 評論 - 26, 引用 - 0
數據加載中……

(轉)Windows CE下訪問物理內存的一些方法!!

嵌入式設備與桌面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 2007-11-15 12:28 井泉 閱讀(1064) 評論(3)  編輯 收藏 引用 所屬分類: c code

評論

# re: (轉)Windows CE下訪問物理內存的一些方法!!   回復  更多評論   

請問C#如何調用VirtualAlloc()和VirtualCopy()函數?能否給個例子或說明一個
2008-08-13 21:48 | 464999979

# re: (轉)Windows CE下訪問物理內存的一些方法!! [未登錄]  回復  更多評論   

C# 調用windows api 例子太多了。自己搜吧
2008-08-14 09:34 | me

# re: (轉)Windows CE下訪問物理內存的一些方法!!   回復  更多評論   

可是我用了VirtualAlloc()和VirtualCopy()就會出錯啊?
2008-08-14 23:40 | 464999979
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美11—12娇小xxxx| 久久综合九九| 国产精品成人免费视频 | 欧美一级视频免费在线观看| 女人天堂亚洲aⅴ在线观看| 久久久国产精品一区| 伊人久久婷婷色综合98网| 久久综合激情| 欧美成人久久| 亚洲一区二区三区欧美| 亚洲在线一区二区| 国产一区在线观看视频| 久久综合网hezyo| 欧美精品成人91久久久久久久| 欧美人与性动交a欧美精品| 99热在这里有精品免费| 亚洲欧洲午夜| 国产精品视频不卡| 久久综合亚州| 欧美日韩岛国| 久久久久久69| 欧美日本高清| 欧美一级在线播放| 你懂的成人av| 亚洲欧美在线视频观看| 久久久777| 亚洲影院色在线观看免费| 欧美一进一出视频| 99成人精品| 欧美在线视屏| 亚洲手机视频| 麻豆成人在线| 欧美怡红院视频一区二区三区| 91久久国产综合久久蜜月精品| 香蕉精品999视频一区二区| 1769国内精品视频在线播放| 亚洲国产精品va在看黑人| 国产精品青草综合久久久久99| 99re66热这里只有精品4| 亚洲欧美激情视频在线观看一区二区三区| 欧美成人69av| 久久久之久亚州精品露出| 欧美经典一区二区三区| 久久蜜桃精品| 国产精品久久福利| 亚洲国产精品www| 激情久久婷婷| 亚洲欧美日韩精品久久| 一区二区三区高清在线| 久久久另类综合| 欧美在线你懂的| 欧美体内谢she精2性欧美| 欧美大片第1页| 狠狠狠色丁香婷婷综合激情| 亚洲视频二区| 亚洲视频在线观看视频| 欧美精彩视频一区二区三区| 欧美va天堂在线| 激情另类综合| 久久久国产午夜精品| 欧美伊人影院| 国产欧美日韩在线视频| 亚洲视频免费在线观看| 在线性视频日韩欧美| 欧美大秀在线观看| 亚洲国产你懂的| 亚洲精品小视频在线观看| 久久夜色精品国产亚洲aⅴ| 久久久久久久久久久久久久一区| 久久综合狠狠综合久久综青草| 亚洲激情二区| 欧美精品国产| 日韩一级在线| 亚洲欧美日韩国产中文在线| 国产精品久久久久久久电影 | 国产精品99久久久久久久久久久久| 亚洲日本成人| 亚洲乱码国产乱码精品精天堂 | 亚洲欧洲一区二区三区久久| 亚洲国产乱码最新视频| 免费亚洲婷婷| 亚洲国产精品一区二区久| 最近看过的日韩成人| 欧美精品久久久久久久免费观看 | 国内精品美女av在线播放| 欧美一级二级三级蜜桃| 麻豆成人综合网| 在线观看欧美日韩国产| 美女视频网站黄色亚洲| 亚洲激情成人| 亚洲欧美一区二区三区久久| 国产欧美日韩一区二区三区在线 | 欧美凹凸一区二区三区视频| 在线看国产一区| 欧美精品自拍偷拍动漫精品| 夜夜狂射影院欧美极品| 性做久久久久久久久| 国产综合香蕉五月婷在线| 麻豆九一精品爱看视频在线观看免费 | 亚洲女同性videos| 久久青草久久| 一区二区三区日韩精品视频| 国产精品国产成人国产三级| 性视频1819p久久| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品自拍一区| 美女精品在线观看| 一本色道久久综合亚洲精品按摩| 亚洲国产一区二区在线| 欧美日韩一区二区精品| 久久久久久久综合狠狠综合| 亚洲欧洲久久| 久久深夜福利| 亚洲综合视频一区| 亚洲丰满在线| 国产午夜久久| 欧美日韩一视频区二区| 久久久久久久一区二区| 亚洲天堂激情| 亚洲欧洲在线观看| 久久久久亚洲综合| 亚洲天堂激情| 亚洲精品欧美激情| 伊人男人综合视频网| 国产精品免费一区豆花| 欧美成人精品三级在线观看| 午夜精品理论片| 国产精品99久久久久久人 | 国产精品高潮呻吟久久av黑人| 欧美激情第二页| 久久精品一区二区国产| 一本色道久久88精品综合| 亚洲国产精品久久精品怡红院| 久久久精品国产免大香伊| 一区二区91| 亚洲精品欧美| 亚洲高清不卡一区| 欧美成人久久| 欧美不卡激情三级在线观看| 欧美一级二区| 久久经典综合| 久久大逼视频| 久久精品日韩| 久久精品亚洲国产奇米99| 亚洲欧美精品一区| 午夜在线一区| 久久福利资源站| 久久久久久9999| 久久婷婷国产综合尤物精品| 久久精品在线| 蜜臀va亚洲va欧美va天堂| 久久噜噜噜精品国产亚洲综合 | 欧美丝袜第一区| 欧美日韩一二三四五区| 欧美日韩精品欧美日韩精品| 欧美激情免费在线| 欧美日韩午夜精品| 国产精品国产自产拍高清av王其| 性做久久久久久免费观看欧美| 麻豆成人在线| 欧美成人午夜激情在线| 亚洲国产精品一区| 亚洲日本免费电影| 一区二区三区精品国产| 亚洲一二三区在线观看| 香蕉久久精品日日躁夜夜躁| 久久国产欧美| 欧美成人一区二免费视频软件| 亚洲欧美视频| 欧美一区二区视频观看视频| 欧美亚洲网站| 欧美插天视频在线播放| 欧美三区在线| 一区在线观看视频| 日韩视频精品在线| 性欧美大战久久久久久久免费观看 | 免费在线日韩av| 欧美视频一区二区| 国内精品国产成人| 亚洲精品一区二区三| 午夜亚洲性色视频| 欧美激情片在线观看| 亚洲精品国精品久久99热一| 亚洲一区在线看| 麻豆精品在线视频| 国产精品久在线观看| 精品va天堂亚洲国产| 在线一区视频| 欧美不卡激情三级在线观看| 日韩一二三在线视频播| 欧美在线影院在线视频| 欧美日韩麻豆| 在线高清一区| 亚洲欧美在线网| 亚洲风情亚aⅴ在线发布| 一区二区三区色| 免费观看亚洲视频大全| 国产日韩在线不卡| 亚洲综合色丁香婷婷六月图片| 亚洲巨乳在线|