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

隨筆 - 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 井泉 閱讀(1051) 評論(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>
            国产精品羞羞答答| 国产精品成人免费精品自在线观看| 小处雏高清一区二区三区 | 欧美一级网站| 暖暖成人免费视频| 国产欧美一区二区三区视频| 亚洲国产精品电影| 欧美一区二区三区四区在线观看地址| 欧美国产亚洲视频| 西西裸体人体做爰大胆久久久| 你懂的视频一区二区| 国产婷婷色一区二区三区在线| 日韩午夜电影av| 欧美激情1区2区| 久久国产精彩视频| 国产日本亚洲高清| 亚洲一区二区三区免费在线观看| 欧美chengren| 久久久伊人欧美| 韩日成人av| 欧美专区在线观看一区| 欧美黄在线观看| 免费在线国产精品| 狠狠色伊人亚洲综合成人| 欧美一级片久久久久久久| 欧美一区二区三区视频免费| 亚洲日本在线观看| 麻豆精品视频在线观看| 国产精品久久午夜夜伦鲁鲁| 欧美aⅴ一区二区三区视频| 国产伦精品一区二区三区视频孕妇| 亚洲肉体裸体xxxx137| 欧美黑人国产人伦爽爽爽| 久久婷婷麻豆| 亚洲国产精品第一区二区| 欧美第十八页| 男女精品视频| 一道本一区二区| aa成人免费视频| 国产精品成人aaaaa网站| 亚洲综合视频一区| 久久婷婷av| 91久久国产综合久久| 亚洲国产日韩欧美在线图片 | 欧美大色视频| 亚洲免费av电影| 亚洲精品免费观看| 欧美成人嫩草网站| 亚洲综合国产| 午夜精品一区二区三区电影天堂 | 亚洲高清不卡在线观看| 亚洲精品一区在线观看| 欧美日韩综合网| 鲁大师成人一区二区三区| 欧美日韩国产小视频| 久久久精品视频成人| 欧美久久电影| 久久精品日产第一区二区三区| 欧美电影在线免费观看网站| 久久9热精品视频| 欧美三级视频在线观看| 欧美成人免费在线| 国产日本欧洲亚洲| 亚洲少妇最新在线视频| 亚洲全部视频| 久久久www免费人成黑人精品 | 久久亚洲综合色| 欧美日韩你懂的| 欧美成人免费在线视频| 国产欧美日韩综合一区在线播放| 亚洲欧洲精品一区| 国模大胆一区二区三区| 亚洲无人区一区| 亚洲天堂网在线观看| 欧美+日本+国产+在线a∨观看| 久久精品国产精品亚洲精品| 欧美体内she精视频在线观看| 欧美国产日韩精品免费观看| 国产一区二区按摩在线观看| 亚洲私人影院在线观看| 正在播放日韩| 欧美剧在线观看| 亚洲人妖在线| 一本色道久久综合精品竹菊 | 亚洲一区免费看| 欧美猛交免费看| 91久久精品一区二区三区| 亚洲成色777777女色窝| 久久激情网站| 久久精品夜色噜噜亚洲aⅴ| 国产精品理论片在线观看| 亚洲免费福利视频| 在线视频欧美日韩| 欧美日韩二区三区| 亚洲乱码国产乱码精品精98午夜| 亚洲麻豆av| 欧美日韩一区免费| 亚洲视频播放| 久久高清福利视频| 国外精品视频| 美女日韩在线中文字幕| 亚洲国产成人高清精品| 99精品国产高清一区二区| 欧美精品在线免费观看| 一区二区三区精品视频在线观看| 亚洲一区二区在线免费观看视频| 欧美日韩亚洲91| 亚洲欧美国产日韩天堂区| 久久激情综合| 影音欧美亚洲| 久久精品人人做人人爽电影蜜月| 欧美一级视频免费在线观看| 国产精品视频久久一区| 久久aⅴ国产紧身牛仔裤| 欧美~级网站不卡| 99re6这里只有精品| 国产精品美女一区二区在线观看| 欧美亚洲尤物久久| 亚洲国产精品嫩草影院| 亚洲在线播放电影| 狠狠色香婷婷久久亚洲精品| 欧美高清在线一区| 亚洲一区二区精品视频| 久久这里有精品15一区二区三区| 在线观看国产精品淫| 欧美jizz19性欧美| 亚洲视频1区2区| 狼狼综合久久久久综合网| 亚洲精品少妇| 国产欧美视频一区二区| 蜜桃久久精品一区二区| 亚洲视频在线视频| 亚洲成人中文| 久久成人精品| 夜夜嗨av一区二区三区四区| 国产一二精品视频| 欧美视频在线观看| 美女国产一区| 午夜精品理论片| 亚洲精品美女久久7777777| 久久激情一区| 亚洲欧美另类在线观看| 亚洲欧洲三级| 一区二区亚洲精品| 国产精品观看| 欧美精品午夜| 巨乳诱惑日韩免费av| 亚洲女性喷水在线观看一区| 亚洲国产精品免费| 免费视频一区| 久久成年人视频| 亚洲免费在线电影| 亚洲精品视频免费在线观看| 国模一区二区三区| 欧美日韩不卡在线| 久久精品官网| 亚洲一区二区综合| 这里只有精品视频在线| 亚洲黄一区二区| 国产综合av| 国产婷婷成人久久av免费高清| 欧美日韩一级大片网址| 欧美岛国在线观看| 久久久视频精品| 久久精品国产清自在天天线| 亚洲影院免费观看| 亚洲午夜未删减在线观看| 亚洲美女啪啪| 亚洲第一毛片| 欧美激情亚洲另类| 一本色道久久综合亚洲精品按摩| 久久最新视频| 久久午夜羞羞影院免费观看| 久久国产精品免费一区| 午夜国产精品影院在线观看| 亚洲一级免费视频| 中文日韩电影网站| 亚洲图片欧洲图片av| 亚洲午夜精品久久久久久浪潮| 9色国产精品| 99re热这里只有精品免费视频| 亚洲高清中文字幕| 亚洲人体1000| 国产精品99久久久久久久久| 在线综合视频| 欧美一区二区三区免费看| 久久国产精品久久国产精品| 久久久欧美精品| 欧美成人有码| 亚洲国产精品一区二区尤物区 | 欧美日韩国产综合新一区| 欧美黄色视屏| 欧美三级电影大全| 国产日韩欧美在线看| 国产在线乱码一区二区三区| 在线日韩日本国产亚洲| 一区二区精品| 久久精品99国产精品| 欧美成人69| 亚洲美女尤物影院|