Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows ce Windows CE:在OAL和内核驱动程序之间共享内存_Windows Ce_Xilinx - Fatal编程技术网

Windows ce Windows CE:在OAL和内核驱动程序之间共享内存

Windows ce Windows CE:在OAL和内核驱动程序之间共享内存,windows-ce,xilinx,Windows Ce,Xilinx,有没有办法在OAL和内核驱动程序之间共享内存?OAL和内核之间有一个可用于共享内存的NKGlobal结构。我想用类似的方法来共享内存。我在Xilinx板上使用Windows Embedded Compact 2013 到目前为止,在OAL层中,我对分配的内存进行了virttophy操作,以获取物理地址。在内核驱动程序中,我尝试了VirtualAllocopyEx,但我不知道在pAddr中传递什么 LPVOID VirtualAllocCopyEx ( HANDLE hSrcPr

有没有办法在OAL和内核驱动程序之间共享内存?OAL和内核之间有一个可用于共享内存的NKGlobal结构。我想用类似的方法来共享内存。我在Xilinx板上使用Windows Embedded Compact 2013

到目前为止,在OAL层中,我对分配的内存进行了virttophy操作,以获取物理地址。在内核驱动程序中,我尝试了VirtualAllocopyEx,但我不知道在pAddr中传递什么

  LPVOID VirtualAllocCopyEx (
       HANDLE hSrcProc,
       HANDLE hDstProc,
       LPVOID pAddr,
       DWORD cbSize,
       DWORD dwProtect
  );

如果驱动程序在内核模式下运行,它将共享OAL的相同地址空间,因此您可以直接传递指针。您可以在驱动程序或OAL中分配缓冲区,并在OAL中使用OEMIoControl中实现的IOCTL共享一个值(如果您的BSP使用公共生产质量层,您可以检查其他IOCTL是如何实现的,通常需要在结构表中添加一条记录,并实现一个函数来管理特定的IOCTL)。
两个组件都可以使用该指针访问内存。

如果在内核模式驱动程序中,我执行g_pNKGlobal=(pNKGlobal)0x8287a087(从OAL打印的地址)。然后是RETAILMSG(1,(L“版本:%08x\r\n”,g_pNKGlobal->dwVersion)。我在内核中运行用户代码时遇到系统错误。如果您需要共享此类信息,实现自定义内核IOCTL将是最佳选择。但您应该能够访问该内存位置,因为0x8000000是内核内存的起始地址。您确定驱动程序正在内核模式下运行吗?我100%确定t在内核模式下运行。我可以访问GPIO寄存器。我怀疑内存受到保护,无法从内核驱动程序访问。这就是为什么OAL和内核通过使用NKGlobal和OEMGlobal结构相互通信。NKGlobal和OEMGlobal在CE 5.0中使用,它们被保留在适当的位置,以便于从CE 5.0迁移对于CE 6.0,内核是一个DLL,不再是链接到内核可执行文件的静态库。Windows CE中的AFAIK内存保护在进程之间,内核模式驱动程序在内核进程中运行,调用内核函数时没有上下文切换,因此没有MMU的重新映射。查看您的地址,我注意到它是一个偶数数字,你确定吗?ARM上的指针必须是32位对齐的(除非使用unaligned关键字来定义它们),而且在x86上,内存中的结构通常是32位打包的。