阅读:1402回复:7
物理内存的访问
WINCE 下如何访问一段物理内存?
但不是 DMA 方式? 我硬件用的是内存映射方式的。 |
|
最新喜欢:yellow...
|
沙发#
发布于:2002-11-25 21:21
为什么没有人理我?
100分向送! |
|
|
板凳#
发布于:2002-11-26 08:55
WDM中的方法,不知道对你有没有参考意义:
typedef struct _DEVICE_EXTENSION { ... PUCHAR membase; ULONG nbytes; ... } DEVICE_EXTENSION, *PDEVICE_EXTENSION; PHYSICAL_ADDRESS membase; // base address of range ... for (ULONG i = 0; i < nres; ++i, ++resource) { switch (resource->Type) { case CmResourceTypeMemory: membase = resource->u.Memory.Start; <--1 pdx->nbytes = resource->u.Memory.Length; break; ... } ... pdx->membase = (PUCHAR) MmMapIoSpace(membase, pdx->nbytes, MmNonCached); <--2 if (!pdx->membase) return STATUS_NO_MEMORY; 在资源描述符中,u.Memory含有内存资源信息。u.Memory.Start是一个内存范围的起始地址,u.Memory.Length是该范围的字节长度。起始地址是一个64位的PHYSICAL_ADDRESS值。u.Port和u.Memory子结构完全相同,这是故意的,并非偶然,如果你需要你可以依靠这个事实。 你必须调用MmMapIoSpace函数获得一个内核模式虚拟地址,这样内存范围才能被访问。 简单的可以这样用: PHYSICAL_ADDRESS paddr; paddr.QuadPart = (__int64)Entry; tmpentry = (ULONG *)MmMapIoSpace (paddr,32,MmNonCached); |
|
|
地板#
发布于:2002-11-26 09:12
看看这个贴子哪http://www.driverdevelop.com/forum/html_27032.html?1038273358
[编辑 - 11/26/02 by Davisfront] |
|
地下室#
发布于:2002-11-27 10:03
楼上的两位老兄,先谢谢了.
分 我已先给了一部分,ydyuse 的在 另外一个地方 ABC 给的. 但我感觉在 CE 下 好象和这还有一些不一样的. 在把我的问题说详细一点吧: 我在PCM3350上用的一块双口RAM,使用的是内存映射方式. 地址为D0000到DFFFF共4k.要在应用程序中使用这一块内存,先要在驱动中将这块物理内存映射为系统内存,然后再进行操作.另外好象还要在CONFIG.BIB中进行一些什么配置之类的.CONFIG.BIB配置的地址是怎么得到的呢? 不知谁能再告诉我一下. 谢谢!!! |
|
|
5楼#
发布于:2002-11-30 13:31
大家帮帮忙呀?
|
|
|
6楼#
发布于:2002-12-02 21:13
用VirtualAlloc and Virtualcopy 映射
|
|
|
7楼#
发布于:2002-12-03 17:33
我现在又遇到了中断的问题
中断服务程序怎么和中断号关联起来呀? 需要在注册表里配置还是用程序写? |
|
|