引用 4 楼 sunrain_hjb 的回复:
换句话说,楼主目的就是能在应用程序中访问特定的物理空间吗?
你可以把相关的代码贴出来让大家帮忙看看。
并不需要应用去访问特定的物理空间。
说简单一点,我从FrameBuffer可以拿到两个backbuffer,虚拟地址分别为:0xd2fafc00和0xd2fcbe00。
第三个buffer由于Framebuffer大小不够就动态分配,地址为:0xd3bf0000。
目前使用Samsung的Display驱动,调用到子类s5p6440Surf的构造函数:
s5p6440Surf::s5p6440Surf(int width, int height, DWORD offset, VOID *pBits, int stride,EGPEFormat format, EDDGPEPixelFormat pixelFormat, SurfaceHeap *pHeap)
: DDGPESurf(width, height, pBits, stride, format, pixelFormat)
其中上面提到的三个虚拟地址都以 VOID *pBits的参数传入。而这个pBits实际上作为DDGPESurf类构造函数的初始值来使用。
然而应用程序在使用这三个buffer的时候,在应用程序中两个从framebuffer分配出来的buffer其虚拟地址分别变成了0x14fc00和0x16be00。而由动态分配出的那个buffer在应用程序中的地址仍旧为0xd3bf0000。
那么可以认为在驱动与应用之间Wince做了相应的内存映射,应用由于只能使用User Space的地址,Wince在User Space分配了虚拟地址并指向实际的物理内存。但是目前不明白的是,在驱动层面我只需将虚拟地址传递给pBits这个参数,之后都是由DDGPESurf类来处理,这部分都是直接使用CE提供的lib,它为何能区分对待不同的虚拟地址。
现在看应该是有些条件没有满足,所以导致CE没法对我动态分配的地址进行转换,所以现在想了解的是怎样才能让CE把这个事给做了。