随笔分类 -  wince5.0函数介绍

摘要:CEDDK提供了DMA的相关函数,在CEDDK/DDK_DMA/ddk_dma.c中定义。实际上里面最有用的就两个函数,HalAllocateCommonBuffer(..)和HalFreeCommonBuffer(..)分别用于为DMA申请和释放  首先介绍一下会用到的DMA适配器结构,在ceddk.h中定义,如下:typedef struct _DMA_ADAPTER_OBJECT_{  USHORT ObjectSize;        //该结构的大小  INTERFACE_TYPE InterfaceType;  //接口类型,一般用做DMA时设置为Internal  ULONG B 阅读全文
posted @ 2010-06-12 15:45 gmh 阅读(3562) 评论(0) 推荐(0)
摘要:对于KernelIoControl这个函数我们并不陌生,在2440 5.0BSP当中,这个函数在很多驱动中出现了,主要是用来申请中断,比如下面BOOL RetVal = KernelIoControl( IOCTL_HAL_REQUEST_SYSINTR, &Irq, sizeof( Irq ), pSysIntr, sizeof( *pSysIntr ), NULL );-------------------其实他的作用远远不止申请/释放中断那么简单,下面来看看PB的帮助文档。This function provides the kernel with a generic I/O contr 阅读全文
posted @ 2010-05-05 10:24 gmh 阅读(1842) 评论(0) 推荐(0)
摘要:首先要理解 windows CE 下的地址映射机制。 wince有两种地址:物理地址和虚拟地址.不同架构的 CPU 硬件上的区别导致地址映射也不同。MIPS和SH x 处理器,不采用MMU,直接在CPU和内核里定义 1G 的物理地址;而X86和ARM带有 MMU 单元,在 OEMAddressTable 中定义物理地址到虚拟地址间的映射关系或者是OS启动后调用 CreateStaticMapping 和 NKCreateStaticMapping 来实现从虚拟地址到物理地址的静态映射.经过静态映射的地址,可以由操作系统内核用于 ISR 访问设备。如果我们要在应用程序中访问外设,必须在物理地址和 阅读全文
posted @ 2010-04-29 16:20 gmh 阅读(1065) 评论(0) 推荐(0)
摘要:先说VirtualAlloc 和VirtualCopy VirtualAlloc 首先会从我们的虚拟地址空间中申请(或者说预留)一块虚拟空间,准备接下来要用它。注意此时,可用的物理内存并没有减少,只是虚拟地址少了一块可用的区域。真正把这块之前reserved的虚拟空间映射到物理的内存区域就是由VirtualCopy来干的,此时,MMU的页表就会增加一个entry,来表示物理--虚拟的映射关系。再说动态虚拟内存映射和静态虚拟内存映射 OEMaddressTable只是建立了一个一级的静态虚拟--物理的映射关系,一般给kernel(NK.EXE)通过直接访问的形式来用(OALPAtoVA); Mm 阅读全文
posted @ 2010-04-29 10:52 gmh 阅读(828) 评论(0) 推荐(1)
摘要:1.VirtualAlloc用来在进程的虚拟地址空间中保留(reserve)或者提交(commit)页。在保留时以64KB为粒度,即保留空间以64K为单位。而提交虚拟地址时,则以页(典型大小为4KB)为单位。2.VirtualCopy用来绑定一块物理内存到当前进程虚拟地址空间。参数里的lpvSrc既可以是内核段的虚拟地址也可以是物理地址(用page_physical来标记)。同时要注意lpvSrc的右移与否。 PAGE_PHYSICAL这个参数决定了要右移八位(除以256),不过还有一点就是使用了PAGE_PHYSICAL之后就不要使用VirtualFree 了因为,使用了也无济于事3.使用V 阅读全文
posted @ 2010-04-29 10:39 gmh 阅读(696) 评论(0) 推荐(0)
摘要:1.如果是在bootloader中打开MMU之前,程序访问设备寄存器,可以直接操作物理地址,无需虚实映射。2.wince启动后,硬件上ARM和X86体系的处理器启动了MMU,操作系统只能访问到虚拟地址,不能直接操作物理内存了。但是如果是X86的CPU,由于它的外设I/O端口和存储器空间分开编址,可以直接嵌入汇编或者使用宏read_port_xxx,write_port_xxx来读写设备寄存器的物理地址。3.wince软件结构里对应MMU的是一个名为OEMAddressTable的数据结构(源文件oeminit.asm中),其中建立了物理地址和虚拟地址的静态映射关系,也可以在其中改动系统所能识别 阅读全文
posted @ 2010-04-29 10:37 gmh 阅读(349) 评论(0) 推荐(0)
摘要:DWORD WaitForMultipleObjects( DWORD nCount, const HANDLE* lpHandles, BOOL bWaitAll, DWORD dwMilliseconds);其中参数 nCount 句柄的数量 最大值为MAXIMUM_WAIT_OBJECTS(64)HANDLE 句柄数组的指针。HANDLE 类型可以为(Event,Mutex,Process,Thread,Semaphore )数组BOOL bWaitAll 等待的类型,如果为TRUE 则等待所有信号量有效在往下执行,FALSE 当有其中一个信号量有效时就向下执行DWORD dwMilli 阅读全文
posted @ 2009-02-25 17:22 gmh 阅读(10397) 评论(1) 推荐(0)
摘要:在16位Windows中是有区别的,因为在16位windows用一个全局堆和局部堆来管理内存,每一个应用程序或dll装入内存时,代码段被装入全局堆,而系统又为每个实例从全局堆中分配了一个64kb的数据段作为该实例的局部堆,用来存放应用程序的堆栈和所有全局或静态变量。而LocalAlloc/GlobalAlloc就是分别用于在局部堆或全局堆中分配内存。 由于每个进程的局部堆很小,所以在局部堆中分配内存会受到空间的限制。但这个堆是每个进程私有的,相对而言分配数据较安全,数据访问出错不至于影响到整个系统。 而在全局堆中分配的内存是为各个进程共享的,每个进程只要拥有这个内存块的句柄都可以访问这块内存, 阅读全文
posted @ 2009-02-25 15:33 gmh 阅读(346) 评论(0) 推荐(0)
摘要:一般在ARM架构的CPU上,物理地址都是统一编址的,寻址空间为4GB(32Bit CPU)。也就是说,针对一个ARM的处理器,它可以访问的物理空间是4GB。在WinCE中,ARM中的4GB物理地址空间将被映射为512MB的虚拟内存空间。OEMAddressTable就是一个4GB物理地址空间到WinCE Kernel中的512MB虚拟地址空间的映射表。   在BSP中,会定义OEMAddressTable来描述系统中可访问的物理空间及对应的虚拟地址空间,还有大小。这个表会在WinCE系统开始启动的时候传给MMU,具体到BSP中应该是在OAL中的startup.s中,OEMAddressTabl 阅读全文
posted @ 2009-01-08 15:49 gmh 阅读(268) 评论(0) 推荐(0)