小弟刚开始学WINCE,两种方法实现,物理内存分配时,遇到一问题

caomanning 2007-08-29 07:51:57
两种方法实现,物理内存分配:

1
pOpen->pDriverInfo->pVIMRegs[VIN_MB1 ] = (unsigned long)AllocPhysMem(0x80000, PAGE_READWRITE, 0, 0, (PULONG)0x09000000);

2
pOpen->pDriverInfo->pVIMRegs[VIN_MB1 ] = (unsigned long)VirtualAlloc(NULL, 0x80000, MEM_RESERVE, PAGE_READWRITE);
VirtualCopy( (PVOID)(pOpen->pDriverInfo->pVIMRegs[VIN_MB1 ]),
(PVOID)(0x09000000),0x80000, PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL);


如果使用"AllocPhysMem"
参数设为 PAGE_NOACCESS , WINCE加载dll时没有问题, 但是此参数应设为 READWRITE!

如果参数设为 PAGE_READWRITE, 当WINCE 加载dll时
程序会自动停在 virtmen.C //NK/KERNEL
LPVOID
SC_AllocPhysMem(
DWORD cbSize,
DWORD fdwProtect, // type of access protection
DWORD dwAlignmentMask,
DWORD dwFlags, // Reserved for now, must be zero
PULONG pPhysicalAddress
)
{
LPVOID pVirtualBuffer = NULL;
ULONG ulPFN;
DWORD dwPages = (cbSize + (PAGE_SIZE - 1)) / PAGE_SIZE;
TRUSTED_API (L"SC_AllocPhysMem", NULL);

if (!cbSize || !pPhysicalAddress || dwFlags) {
KSetLastError(pCurThread, ERROR_INVALID_PARAMETER);
return NULL;
}

if ((ulPFN = GetContiguousPages(dwPages, dwAlignmentMask, dwFlags)) == INVALID_PHYSICAL_ADDRESS) {
KSetLastError(pCurThread, ERROR_NOT_ENOUGH_MEMORY);
DEBUGMSG(ZONE_VIRTMEM, (TEXT("Couldn't get %d pages contiguous\r\n"), dwPages));
} else {
DEBUGMSG(ZONE_VIRTMEM, (TEXT("Got %d pages contiguous @ 0x%08X\r\n"), dwPages, ulPFN));
//
// Allocate the virtual memory with contiguous physical pages
//
pVirtualBuffer = DoVirtualAlloc(0, cbSize, MEM_COMMIT, fdwProtect|PAGE_NOCACHE, MEM_CONTIGUOUS, ulPFN);
if (pVirtualBuffer) {
*pPhysicalAddress = PFN2PA(ulPFN); // <------- 此处
}
}
DEBUGMSG(ZONE_VIRTMEM, (TEXT("CeAllocPhysMem - VA: %08X PA:%08X \r\n"), pVirtualBuffer, *pPhysicalAddress));
return pVirtualBuffer;
}

在PB的 debug信息中 :

20497 PID:cdf76b72 TID:cdf7bfda 0x8dfa6000: Exception 060 Thread=8dfa6000 Proc=cdf76b72 'device.exe'
20497 PID:cdf76b72 TID:cdf7bfda 0x8dfa6000: AKY=0000000b PC=8822ba48(NK.EXE+0x0002ba48) RA=8822ba34(NK.EXE+0x0002ba34) TEA=09000000

不知为何? 向前辈请教

对应的两种 free的写法,不知对否?
FreePhysMem((PULONG)0x09000000);

VirtualFree((PVOID)(pOpen->pDriverInfo->pVIMRegs[VIN_MB1 ]),0, MEM_RELEASE);
...全文
260 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ggsddu_1997 2008-12-04
  • 打赏
  • 举报
回复
mark一下,从来没有研究过这种问题。
gooogleman 2008-12-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 72193 的回复:]
这个版面的人很少,而且会的不多。那天我问一个arm 汇编的问题,都没有人理我。后来自己查找资料去了。
[/Quote]

以后常来,08年以后有了我们这些新生代就火爆起来了。
72193 2007-09-01
  • 打赏
  • 举报
回复
这个版面的人很少,而且会的不多。那天我问一个arm 汇编的问题,都没有人理我。后来自己查找资料去了。
caomanning 2007-08-31
  • 打赏
  • 举报
回复
为何大家的问题都有回复,而我的没有。
是我问得不详细?

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧