主题 : 为什么0x56000000映射到虚拟地址是0xB1600000? 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 82595
精华: 0
发帖: 32
金钱: 160 两
威望: 32 点
贡献值: 0 点
综合积分: 64 分
注册时间: 2012-11-24
最后登录: 2013-10-10
楼主  发表于: 2013-03-11 23:20

 为什么0x56000000映射到虚拟地址是0xB1600000?

  新手乍到,看“LEDDriver.cpp”时遇到拦路虎:
void Virtual_Alloc()
{    
s2440IOP = (volatile IOPreg *) VirtualAlloc(0,sizeof(IOPreg),MEM_RESERVE, PAGE_NOACCESS);
    if(s2440IOP == NULL) {
        RETAILMSG(1,(TEXT("For s2440IOP: VirtualAlloc faiLED!\r\n")));
    }
    else {
        if(!VirtualCopy((PVOID)s2440IOP,(PVOID)(IOP_BASE),sizeof(IOPreg),PAGE_READWRITE | PAGE_NOCACHE )) {
            RETAILMSG(1,(TEXT("For s2440IOP: VirtualCopy faiLED!\r\n")));
        }
    }

    
}

在网上找的资料:
    /*GPIO Virtual alloc   先是用VirtualAlloc()来预留一块内存,如果成功则用VirtualCopy()映射IOP_BASE到刚申请的一块内存里。
    在WINCE下能够直接访问的都是虚拟地址,不能直接访问GPIO端口,因此我们首先需要将GPIO口的物理地址映射到虚拟地址上来。
    分别使用VirtualAlloc和VirtualCopy这两个函数来完成映射!
    这两个函数的原型:
    LPVOID VirtualAlloc(      LPVOID lpAddress,        DWORD dwSize,DWORD flAllocationType,    DWORD flProtect );
    BOOL VirtualCopy( LPVOID lpvDest, LPVOID lpvSrc, DWORD cbSize, DWORD fdwProtect );
    如果这两个函数执行成功,哪么VirtualAlloc将返回一个指针,使用这个指针我们就可以直接访问GPIO,通过读写相关地址寄存器,来控制GPIO端口!*/

发现 “#define IOP_BASE      0xB1600000 // 0x56000000”
在这儿彻底晕倒。。 产生一大堆问号。。
为什么0x56000000映射到虚拟地址是0xB1600000  ?
CE系统就是这样规定的?
还是这就是一条”定理“?
还是有太多东西不懂了,要想理解这个 我需要补充什么东西?
请好心人指教!小弟先行谢过!

级别: 新手上路
UID: 67412
精华: 0
发帖: 19
金钱: 95 两
威望: 19 点
贡献值: 0 点
综合积分: 38 分
注册时间: 2012-04-11
最后登录: 2013-10-18
1楼  发表于: 2013-06-04 15:43