我用IOCTL为应用返回这片内存的物理及虚拟地址,为什么在应用中使用该虚拟地址操作这片内存就会Data Abort??
// Request Application Memory
if ( !DeviceIoControl(hCamDrv, IOCTL_VDC_REQUEST_APPLICATION_MEMORY, &ApplicationMemoryArgs, sizeof(VDC_APPLICATION_MEMORY_ARGS), NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(CAMTEST_ERR,(L"[CAMTEST:ERROR] IOCTL_VDC_REQUEST_APPLICATION_MEMORY Failed\n"));
goto CleanUp;
}
else
{
printf("[CAMTEST:INFO] APPLICATION MEMORY: Phisical Address = 0x%08x \r\n", ApplicationMemoryArgs.dwPhysicalAddress);
printf("[CAMTEST:INFO] APPLICATION MEMORY: Virtual Address = 0x%08x \r\n", ApplicationMemoryArgs.pVirtualAddress);
printf("[CAMTEST:INFO] APPLICATION MEMORY: Capacity = %d \r\n", ApplicationMemoryArgs.dwCapacity);
printf(" Test Access to Application Buffer:\r\n");
tmp = ApplicationMemoryArgs.pVirtualAddress;
printf(" Before Access: %d \r\n", *tmp);
*tmp = 3;
//memset(ApplicationMemoryArgs.pVirtualAddress, 3, ApplicationMemoryArgs.dwCapacity);
printf(" After Access: %d \r\n", *tmp);
}
Physical Address 和 Virtual Address 以及 Capacity 都可以正常打印出来。
15 个解决方案
#1
看样子只能使用VirtualCopyEx了
#2
wince 6.0 不能在应用中这样操作的吧。
#3
是啊,如果是CE5.0,是可以这样操作的
但是CE6.0的驱动结构发生了变化,应用不能再直接访问硬件,必须通过驱动才可以的
#4
是啊,翻之前的帖子,hjb大哥有如下解决方案:
http://www.cnblogs.com/we-hjb/archive/2010/02/25/1673815.html
使用VirtualCopyEX来映射。
http://www.cnblogs.com/we-hjb/archive/2010/02/25/1673815.html
使用VirtualCopyEX来映射。
#5
证明该方法可行!已经可以在应用中直接操作这块内存了。
#6
WinCE 6.0 只是不能用VirtualCopy 来操作了,提供了另外的VirtualCopyEx增强版函数。
#7
呵呵,不错啊。
感觉这么用非常方便。
很多5.0上的程序,可以直接移植过来了,而不需要做太多的改动。
#8
那是相当方便,哈哈,谢谢h大哥的代码。
#9
WINCE 6.0禁止这样操作的.
通过驱动才行.
通过驱动才行.
#10
6.0不允许直接操作物理地址
得通过驱动来实现
得通过驱动来实现
#11
帮你顶
#12
if(dwPhyBaseAddress&0xFFF)
{
return NULL;
}
h大哥,代码里这个是起和作用啊
#13
判断 是否已
4KB边界对齐方式分配内存页
#14
恩,就是对齐的问题。
#15
哦,看到MSDN上也有解释。
多谢楼上二位
多谢楼上二位
#1
看样子只能使用VirtualCopyEx了
#2
wince 6.0 不能在应用中这样操作的吧。
#3
是啊,如果是CE5.0,是可以这样操作的
但是CE6.0的驱动结构发生了变化,应用不能再直接访问硬件,必须通过驱动才可以的
#4
是啊,翻之前的帖子,hjb大哥有如下解决方案:
http://www.cnblogs.com/we-hjb/archive/2010/02/25/1673815.html
使用VirtualCopyEX来映射。
http://www.cnblogs.com/we-hjb/archive/2010/02/25/1673815.html
使用VirtualCopyEX来映射。
#5
证明该方法可行!已经可以在应用中直接操作这块内存了。
#6
WinCE 6.0 只是不能用VirtualCopy 来操作了,提供了另外的VirtualCopyEx增强版函数。
#7
呵呵,不错啊。
感觉这么用非常方便。
很多5.0上的程序,可以直接移植过来了,而不需要做太多的改动。
#8
那是相当方便,哈哈,谢谢h大哥的代码。
#9
WINCE 6.0禁止这样操作的.
通过驱动才行.
通过驱动才行.
#10
6.0不允许直接操作物理地址
得通过驱动来实现
得通过驱动来实现
#11
帮你顶
#12
if(dwPhyBaseAddress&0xFFF)
{
return NULL;
}
h大哥,代码里这个是起和作用啊
#13
判断 是否已
4KB边界对齐方式分配内存页
#14
恩,就是对齐的问题。
#15
哦,看到MSDN上也有解释。
多谢楼上二位
多谢楼上二位