EVC中动态映射虚拟地址
来源:互联网 发布:网络电视机顶盒的安装 编辑:程序博客网 时间:2024/05/01 17:36
最早在CE下调屏的值的时候,因为没有挂仿真器,如果每次都是改好下载镜像看效果的话,速度显然太慢了。于是老大就给我出了一个注意,写个小软件直接写LCDC的寄存器看效果。于是就写了一个,效果也很不错,特别是设置IO的时候就变得很方便了。但是这是静态内存映射的,是参考了OAL层中OALPAtoVA函数直接把物理地址根据g_oalAddressTable中的对应关系直接转成虚拟地址的。然而在CE中,需要在全内核模式方可直接访问虚拟地址,而且不同平台下g_oalAddressTable列表也不一样,于是就想做成动态的映射,然而EVC下竟然不支持VirtualCopy,搜了一下帮助竟然没有找到,我的天,那咋整。
还好CSDN上卧虎藏龙,发了个帖子,终于有个兄弟xqhrs232回帖说,EVC下使用VirtualCopy需要声明一下:
#ifdef __cplusplus
extern "C"
{
#endif
BOOL VirtualCopy( LPVOID, LPVOID, DWORD, DWORD );
#ifdef __cplusplus
}
#endif
试了一下,果然可以。呵呵,谢谢这位兄台。
参考了一下函数MmMapIoSpace,稍作修改,终于可以用了。
ULONG CRWregisterDlg::GetVirtMem(ULONG phyaddr)
{
PVOID pVirtualAddress;
ULONG SourceSize;
BOOL bSuccess;
ULONGLONG SourcePhys;
ULONG tempvalue;
SourcePhys = phyaddr & ~(PAGE_SIZE - 1); //页对齐
SourceSize = 4 + (phyaddr & (PAGE_SIZE - 1)); //大小
pVirtualAddress = VirtualAlloc(0, SourceSize, MEM_RESERVE, PAGE_NOACCESS);
if (pVirtualAddress != NULL)
{
bSuccess = VirtualCopy(
pVirtualAddress, (PVOID)(SourcePhys >> 8), SourceSize,
PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE);
if (bSuccess)
{
tempvalue = (ULONG)pVirtualAddress ;
tempvalue += phyaddr & (PAGE_SIZE - 1);
}
else
{
VirtualFree(pVirtualAddress, 0, MEM_RELEASE);
pVirtualAddress = NULL;
tempvalue = 0;
}
}
return tempvalue;
}
再次感谢xqhrs232!
- EVC中动态映射虚拟地址
- 虚拟地址映射小结
- ARM中虚拟地址到物理地址的映射示意图
- linux中S3C2440的物理地址映射到虚拟地址详解
- linux中S3C2440的物理地址映射到虚拟地址详解
- IA32体系32位Linux系统虚拟地址映射中
- win32练习 - 虚拟地址映射
- 进程的虚拟地址映射
- 虚拟地址的映射建立
- uboot中的虚拟地址映射
- Linux下虚拟地址映射
- x86-64虚拟地址映射
- Linux内核访问外设I/O资源的方式(设备物理地址和设备虚拟地址),静态映射和动态映射
- Linux内核访问外设I/O资源的方式(设备物理地址和设备虚拟地址),静态映射和动态映射
- linux虚拟进程地址映射机制
- linux虚拟进程地址映射机制
- 虚拟地址到物理地址的映射
- 虚拟地址与物理地址的映射
- 【图片编程】JPEG的文件格式
- 什么是DSP
- 质问CSDN:为什么把我发布的招聘信息全部删除,而且封冻禁我ID
- 【数据挖掘】数据挖掘技术简介
- 什么是ARM
- EVC中动态映射虚拟地址
- Linux自动备份MySQL数据库
- JBoss下使用标注方式写的一个简单web service 测试
- XFire的标注服务开发
- 点对点通讯:基于即连即用的双向多次Socket信息传输程序
- FakeGPS
- 【08珠海航展】歼-10战斗机
- javax.management.MalformedObjectNameException: Invalid character '' in value part of property ,Oracle 驱动包的错误
- zz游记 from 文杰