WinCE6.0中应用中使用物理地址

时间:2022-07-30 17:32:19
做应用的需要一片固定的内存,我在Config.bib中划好,在驱动里增加了MmIOMapSpace和MmIOUnMapSpace以及对应的IOCTL,在驱动内部测试,这片内存可以正常访问,map以及unmap。
我用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


引用 2 楼 gooogleman 的回复:
wince 6.0 不能在应用中这样操作的吧。


是啊,如果是CE5.0,是可以这样操作的

但是CE6.0的驱动结构发生了变化,应用不能再直接访问硬件,必须通过驱动才可以的

#4


是啊,翻之前的帖子,hjb大哥有如下解决方案:
http://www.cnblogs.com/we-hjb/archive/2010/02/25/1673815.html
使用VirtualCopyEX来映射。

#5


证明该方法可行!已经可以在应用中直接操作这块内存了。

#6


WinCE 6.0 只是不能用VirtualCopy 来操作了,提供了另外的VirtualCopyEx增强版函数。

#7


引用 5 楼 lbqhope 的回复:
证明该方法可行!已经可以在应用中直接操作这块内存了。

呵呵,不错啊。
感觉这么用非常方便。

很多5.0上的程序,可以直接移植过来了,而不需要做太多的改动。

#8


引用 7 楼 sunrain_hjb 的回复:
引用 5 楼 lbqhope 的回复:
证明该方法可行!已经可以在应用中直接操作这块内存了。

呵呵,不错啊。
感觉这么用非常方便。

很多5.0上的程序,可以直接移植过来了,而不需要做太多的改动。


那是相当方便,哈哈,谢谢h大哥的代码。

#9


WINCE 6.0禁止这样操作的.

通过驱动才行.

#10


6.0不允许直接操作物理地址
  得通过驱动来实现

#11


帮你顶

#12


引用 7 楼 sunrain_hjb 的回复:
引用 5 楼 lbqhope 的回复:
证明该方法可行!已经可以在应用中直接操作这块内存了。

呵呵,不错啊。
感觉这么用非常方便。

很多5.0上的程序,可以直接移植过来了,而不需要做太多的改动。


if(dwPhyBaseAddress&0xFFF)
{
          return NULL;
}

h大哥,代码里这个是起和作用啊

#13


引用 12 楼 lbqhope 的回复:
引用 7 楼 sunrain_hjb 的回复:
引用 5 楼 lbqhope 的回复:
证明该方法可行!已经可以在应用中直接操作这块内存了。

呵呵,不错啊。
感觉这么用非常方便。

很多5.0上的程序,可以直接移植过来了,而不需要做太多的改动。





if(dwPhyBaseAddress&0xFFF)
{
  return NULL;
}

h大哥,代码里这……



判断 是否已 
4KB边界对齐方式分配内存页

#14


恩,就是对齐的问题。

#15


哦,看到MSDN上也有解释。
多谢楼上二位

#1


看样子只能使用VirtualCopyEx了

#2


wince 6.0 不能在应用中这样操作的吧。

#3


引用 2 楼 gooogleman 的回复:
wince 6.0 不能在应用中这样操作的吧。


是啊,如果是CE5.0,是可以这样操作的

但是CE6.0的驱动结构发生了变化,应用不能再直接访问硬件,必须通过驱动才可以的

#4


是啊,翻之前的帖子,hjb大哥有如下解决方案:
http://www.cnblogs.com/we-hjb/archive/2010/02/25/1673815.html
使用VirtualCopyEX来映射。

#5


证明该方法可行!已经可以在应用中直接操作这块内存了。

#6


WinCE 6.0 只是不能用VirtualCopy 来操作了,提供了另外的VirtualCopyEx增强版函数。

#7


引用 5 楼 lbqhope 的回复:
证明该方法可行!已经可以在应用中直接操作这块内存了。

呵呵,不错啊。
感觉这么用非常方便。

很多5.0上的程序,可以直接移植过来了,而不需要做太多的改动。

#8


引用 7 楼 sunrain_hjb 的回复:
引用 5 楼 lbqhope 的回复:
证明该方法可行!已经可以在应用中直接操作这块内存了。

呵呵,不错啊。
感觉这么用非常方便。

很多5.0上的程序,可以直接移植过来了,而不需要做太多的改动。


那是相当方便,哈哈,谢谢h大哥的代码。

#9


WINCE 6.0禁止这样操作的.

通过驱动才行.

#10


6.0不允许直接操作物理地址
  得通过驱动来实现

#11


帮你顶

#12


引用 7 楼 sunrain_hjb 的回复:
引用 5 楼 lbqhope 的回复:
证明该方法可行!已经可以在应用中直接操作这块内存了。

呵呵,不错啊。
感觉这么用非常方便。

很多5.0上的程序,可以直接移植过来了,而不需要做太多的改动。


if(dwPhyBaseAddress&0xFFF)
{
          return NULL;
}

h大哥,代码里这个是起和作用啊

#13


引用 12 楼 lbqhope 的回复:
引用 7 楼 sunrain_hjb 的回复:
引用 5 楼 lbqhope 的回复:
证明该方法可行!已经可以在应用中直接操作这块内存了。

呵呵,不错啊。
感觉这么用非常方便。

很多5.0上的程序,可以直接移植过来了,而不需要做太多的改动。





if(dwPhyBaseAddress&0xFFF)
{
  return NULL;
}

h大哥,代码里这……



判断 是否已 
4KB边界对齐方式分配内存页

#14


恩,就是对齐的问题。

#15


哦,看到MSDN上也有解释。
多谢楼上二位