博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WinCE中的虚拟地址和实际的物理地址是如何对应
阅读量:4229 次
发布时间:2019-05-26

本文共 2538 字,大约阅读时间需要 8 分钟。

 
一直在琢磨,WinCE中的虚拟地址和实际的物理地址是如何对应的。比如WinCE.Net4.2提高的源码:C:/WINCE420/PLATFORM/XSC1BD/DRIVERS/DISPLAY/SA_LCD/sa2video.cpp中,有如下代码:

BOOL MapVirtualAddress()
{
     v_pLcdRegs = (volatile SA2lcdregs *)VirtualAllocCopy(sizeof(SA2lcdregs),"DispDrvrInitialize : v_pLcdRegs",(PVOID)(LCD_BASE_U_VIRTUAL));
 if (!v_pLcdRegs)
 {
  Cleanup();
  return FALSE;
 }
     v_pClkRegs = (volatile CLKMAN_REGS *)VirtualAllocCopy(sizeof(CLKMAN_REGS),"DispDrvrInitialize : v_pClkRegs",(PVOID)(CLK_BASE_U_VIRTUAL));
 if (!v_pClkRegs)
 {
  Cleanup();
  return FALSE;
 }
 v_pGPIORegs = (volatile GPIO_REGS *)VirtualAllocCopy(sizeof(GPIO_REGS),"DispDrvrInitialize : v_pGPIORegs",(PVOID)(GPIO_BASE_U_VIRTUAL));
 if (!v_pGPIORegs)
 {
  Cleanup();
  return FALSE;
 }
...

这里的VirtualAllocCopy函数中GPIO_BASE_U_VIRTUAL是如何对应得来的呢?

这里的VirtualAllocCopy函数中GPIO_BASE_U_VIRTUAL是如何对应得来的呢?
1.
先看看它的定义:
#define GPIO_BASE_PHYSICAL              (PERIF_BASE_PHYSICAL + GPIO_OFFSET)
#define GPIO_BASE_C_VIRTUAL             (PERIF_BASE_C_VIRTUAL + GPIO_OFFSET)
#define GPIO_BASE_U_VIRTUAL             (PERIF_BASE_U_VIRTUAL + GPIO_OFFSET)
//
// MEMORY-MAPPED REGISTERS (perifs)
//
#define PERIF_BASE_PHYSICAL   0x40000000
#define PERIF_BASE_C_VIRTUAL  0x86200000
#define PERIF_BASE_U_VIRTUAL  (PERIF_BASE_C_VIRTUAL+CACHED_TO_UNCACHED_OFFSET)
#define CACHED_TO_UNCACHED_OFFSET  0x20000000
#define GPIO_OFFSET                   0x00E00000      // GPIO
 
这个CPIO的定义好像与芯片DataSheet中的物理映射虚地址对应:)
这个CPIO的定义好像与芯片DataSheet中的物理映射虚地址对应:)
2.
在google中搜索,发现了一位joyfly兄的回答非常有道理
具体链结地址:
下面是他的解释:
OEMAddressTable里定义的映射关系是给ARM MMU用的,是在KernelStart(source code参考wince420/private/目录)时建立的,只要WINCE还在跑,就不会解除.
OEMAddressTable 里的Virtual Addr和Physical Addr是对ARM来说的. 其实对于WINCE,就只能访问到它的Virtual address. 也就是说,OEMAddressTable里的Virtual address对WINCE 系统来说才是Physical Address.
经过OEMAddressTable映射后的系统的物理地址,在0x80000000~0x9fffffff之间.是 caching and buffering的地址,这个地址加上0x20000000,就是它的cache & buffering disabled地址.所有的硬件寄存器的地址都在这个地址段上,受MMU保护的.
上面讲的系统的物理地址,从0x80000000~0xbfffffff,在Kernel Mode下都可以直接访问. ISR是在KERNEL里,也就可以直接访问这些系统的物理地址.无所谓"因为ISR只能访问静态映射的虚拟地址".
上面说过,对于ARM来说,有虚拟地址和物理地址之分,对于WINCE来说,也有虚拟地址和物理地址之分. 可以这么说,ARM的虚拟地址就是WINCE系统的物理地址.
32 位的OS总共有4G的虚拟地址空间,WINCE也不例外. 其中,0x00000000~0x80000000是Application Space; 0x80000000~0xffffffff是System Reserved. 系统的物理地址就在System Reserved的这段,只能在KERNEL MODE访问. 那么,当APPLICATION和DRIVER(都是运行在USER MODE)要访问这些在System Reserved地址段的硬件寄存器或MEMORY怎么办呢? 只好再建立一层映射关系,在Application Space里分配一段空间,把它映射到System Reserved里的地址上,这就是VirtualAlloc/Copy和MmMapIoSpace干的事情.
3.
其它参考
(1) Windows CE .NET Advanced Memory Management
 链结:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncenet/html/advmemmgmt.asp
 
 

转载地址:http://pfsqi.baihongyu.com/

你可能感兴趣的文章
Beginning JBoss® Seam: From Novice to Professional
查看>>
Professional XML
查看>>
Foundations of Security: What Every Programmer Needs to Know
查看>>
Pro WF: Windows Workflow in .NET 3.0
查看>>
Beginning SQL Server 2005 Express for Developers: From Novice to Professional
查看>>
Multimedia over IP and Wireless Networks: Compression, Networking, and Systems
查看>>
Hacking Ubuntu: Serious Hacks Mods and Customizations
查看>>
PHP 5 Advanced: Visual QuickPro Guide
查看>>
Adobe Illustrator CS3 Classroom in a Book
查看>>
Sams Teach Yourself Adobe Photoshop CS3 in 24 Hours
查看>>
FileMaker Pro 8.5 Bible
查看>>
AutoCAD: Secrets Every User Should Know
查看>>
Combating Spyware in the Enterprise
查看>>
Microsoft Windows Vista Unveiled
查看>>
How to Cheat at Securing a Wireless Network
查看>>
Sams Teach Yourself Visual C# 2005 in 24 Hours, Complete Starter Kit
查看>>
Smarty Php Template Programming And Applications
查看>>
Web Site Measurement Hacks
查看>>
The Best Damn Windows Server 2003 Book Period
查看>>
Cleaning Windows XP For Dummies
查看>>