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

隨筆 - 74, 文章 - 0, 評(píng)論 - 26, 引用 - 0
數(shù)據(jù)加載中……

(轉(zhuǎn))Windows CE下訪問物理內(nèi)存的一些方法!!

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

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

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

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

LPVOID VirtualAlloc(

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

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

 DWORD flAllocationType,  // 申請(qǐng)類型,分為ReserveCommit

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

);

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

BOOL VirtualCopy(

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

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

 DWORD cbSize,             // 要綁定的大小

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

);

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

下面的代碼顯示了如何使用VirtualAllocVirtualCopy來訪問物理內(nèi)存。因?yàn)?/span>VirtualCopy負(fù)責(zé)把一段物理內(nèi)存和虛擬內(nèi)存綁定,所以VirtualAlloc的時(shí)候只需要對(duì)內(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                   // 是否緩存

);

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

posted on 2007-11-15 12:28 井泉 閱讀(1051) 評(píng)論(3)  編輯 收藏 引用 所屬分類: c code

評(píng)論

# re: (轉(zhuǎn))Windows CE下訪問物理內(nèi)存的一些方法!!   回復(fù)  更多評(píng)論   

請(qǐng)問C#如何調(diào)用VirtualAlloc()和VirtualCopy()函數(shù)?能否給個(gè)例子或說明一個(gè)
2008-08-13 21:48 | 464999979

# re: (轉(zhuǎn))Windows CE下訪問物理內(nèi)存的一些方法!! [未登錄]  回復(fù)  更多評(píng)論   

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

# re: (轉(zhuǎn))Windows CE下訪問物理內(nèi)存的一些方法!!   回復(fù)  更多評(píng)論   

可是我用了VirtualAlloc()和VirtualCopy()就會(huì)出錯(cuò)啊?
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>
            亚洲美女精品久久| 久久青草久久| 性欧美18~19sex高清播放| 欧美国产精品久久| 亚洲精品美女| 亚洲三级性片| 欧美性一区二区| 亚洲一区免费网站| 欧美黄色网络| 制服丝袜激情欧洲亚洲| 欧美激情综合五月色丁香小说| 久久在线视频在线| 一区电影在线观看| 亚洲综合首页| 免费成人激情视频| 亚洲午夜久久久| 亚洲精品国产精品国自产观看浪潮| 欧美h视频在线| 老司机免费视频久久| 亚洲国产精品综合| 欧美成人嫩草网站| 久久精品三级| 性伦欧美刺激片在线观看| 韩日在线一区| 国产精品日韩一区二区三区| 一本色道久久综合亚洲精品婷婷| 久久久免费观看视频| 国产精品视频免费| 亚洲另类自拍| 久久久久国内| 欧美一区二区日韩一区二区| 国产欧美日韩不卡| 欧美日产在线观看| 亚洲激情中文1区| 亚洲电影在线| 国产一级精品aaaaa看| 夜色激情一区二区| 欧美国产激情| 久久久99精品免费观看不卡| 免费毛片一区二区三区久久久| 免费看成人av| 欧美三级欧美一级| 狠狠色综合播放一区二区| 韩国av一区二区三区| 欧美特黄a级高清免费大片a级| 亚洲欧美日韩精品在线| 亚洲视频在线一区观看| 免费久久99精品国产| 日韩亚洲精品在线| 久久精品国亚洲| 欧美成人影音| 久久精品亚洲精品国产欧美kt∨| 夜夜嗨av一区二区三区网页| 久久精品一级爱片| 国产精品午夜春色av| 久久爱另类一区二区小说| 亚洲一区二区在线播放| 激情成人中文字幕| 亚洲日本va午夜在线影院| 久久久久久久久蜜桃| 国产欧美在线视频| 男女激情久久| 欧美激情精品久久久六区热门| 亚洲精品综合| 性久久久久久久| 亚洲精品免费一区二区三区| 欧美激情第9页| 欧美丝袜第一区| 久久久99免费视频| 你懂的国产精品永久在线| 亚洲精品国精品久久99热| 亚洲黄色在线视频| 国产精品日日摸夜夜添夜夜av| 午夜欧美精品久久久久久久| 久久精品理论片| 亚洲私人影院| 亚洲天堂av在线免费观看| 国产女同一区二区| 亚洲激情午夜| 欧美另类视频| 亚洲网站视频| 亚洲视频精选| 老司机午夜精品视频在线观看| 男人的天堂亚洲在线| 久久久午夜电影| 亚洲区一区二区三区| 亚洲欧美日韩成人| 国产精品视频内| 亚洲精品三级| 亚洲美女少妇无套啪啪呻吟| 亚洲国产欧美日韩精品| 日韩视频一区二区三区| 香蕉视频成人在线观看 | 99视频精品免费观看| 亚洲一区在线播放| 欧美日韩在线看| 欧美一级视频精品观看| 久久福利影视| 久久嫩草精品久久久精品一| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美成人免费一级人片100| 亚洲伦理精品| 亚洲高清不卡| 国产有码一区二区| 亚洲综合日本| 久久精品亚洲一区二区| 国产精品一卡二| 久久综合色天天久久综合图片| 欧美不卡视频一区发布| 久久er99精品| 一区二区日韩精品| 亚洲七七久久综合桃花剧情介绍| 亚洲国产精品免费| 你懂的视频一区二区| 亚洲视频一区二区在线观看 | 欧美精品二区| 久久久不卡网国产精品一区| 免费观看欧美在线视频的网站| 亚洲片在线资源| 在线不卡视频| 海角社区69精品视频| 国产综合网站| aa级大片欧美| 亚洲一区二区三区四区五区午夜| 一本大道av伊人久久综合| 日韩网站在线观看| 亚洲免费成人av电影| 日韩视频永久免费| 亚洲欧美日韩人成在线播放| 你懂的网址国产 欧美| 欧美精品一区二区三区很污很色的| 久久久久免费视频| 欧美国产日韩精品| 欧美日韩99| 欧美日韩少妇| 国产精品系列在线播放| 每日更新成人在线视频| 久久久福利视频| 国产精品v欧美精品∨日韩| 欧美日韩在线免费| 国产亚洲综合性久久久影院| 亚洲黄一区二区三区| 亚洲天堂成人| 猛男gaygay欧美视频| 久久久久久一区二区三区| 免费观看久久久4p| 欧美激情精品久久久久久黑人 | 日韩视频一区| 91久久精品www人人做人人爽| 欧美在线关看| 亚洲欧美另类综合偷拍| 欧美性大战久久久久久久蜜臀| 国产一区二区三区在线观看免费| 亚洲激情视频在线观看| 性欧美超级视频| 亚洲激情社区| 亚洲精品综合在线| 欧美在线视频一区二区三区| 欧美一站二站| 国产精品一二| 欧美一区二区三区电影在线观看| 久久先锋影音av| 亚洲精品国久久99热| 久久综合电影一区| 亚洲精品欧美在线| 在线亚洲免费视频| 国产日产高清欧美一区二区三区| 久久色在线播放| 欧美日本免费一区二区三区| 中日韩美女免费视频网站在线观看 | 亚洲一区二区精品视频| 中文在线一区| 亚洲片区在线| 午夜精品久久久久久久99樱桃| 国产亚洲永久域名| 亚洲欧洲精品一区二区三区波多野1战4| 欧美成人嫩草网站| 欧美多人爱爱视频网站| 欧美午夜精品久久久久久超碰| 欧美成人免费在线视频| 亚洲第一精品在线| 欧美大色视频| av成人天堂| 在线免费观看一区二区三区| 亚洲人成人77777线观看| 国产在线观看91精品一区| 亚洲精品一区二区在线观看| 国产一区二区剧情av在线| 亚洲电影免费观看高清| 一区二区欧美国产| 亚洲性线免费观看视频成熟| 蜜臀99久久精品久久久久久软件 | 麻豆91精品91久久久的内涵| 亚洲女人天堂av| 欧美日韩综合另类| 亚洲另类在线一区| 亚洲深夜福利| 国产精品久久久一区二区三区| aa国产精品| 欧美在线免费观看视频|