WinCE中的虚拟地址和实际的物理地址是如何对应

2024-04-17 18:48

本文主要是介绍WinCE中的虚拟地址和实际的物理地址是如何对应,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一直在琢磨,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兄的回答非常有道理
具体链结地址:http://www.palmheart.net/index.php?name=PNphpBB2&file=viewtopic&p=23627
下面是他的解释:
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
 

这篇关于WinCE中的虚拟地址和实际的物理地址是如何对应的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/912557

相关文章

定位cpu占用过高的线程和对应的方法

如何定位cpu占用过高的线程和对应的方法? 主要是通过线程id找到对应的方法。 1 查询某个用户cpu占用最高的进程号 top -u 用户名 2 查询这个进程中占用cpu最高的线程号 top –p 进程号-H    3 查询到进程id后把进程相关的代码打印到jstack文件 jstack -l pid > jstack.txt 4 在jstack文件中通过16进制的线程id搜索到

一台电脑对应一个IP地址吗?‌探讨两台电脑共用IP的可能性

在当今数字化时代,‌IP地址作为网络世界中的“门牌号”,‌扮演着至关重要的角色。‌它负责在网络上唯一标识每一台设备,‌使得数据能够在庞大的互联网中准确无误地传输。‌然而,‌对于IP地址与电脑之间的对应关系,‌许多人可能存有疑惑:‌一台电脑是否必须对应一个IP地址?‌两台电脑又是否可以共用一个IP地址呢?‌本文将深入探讨这些问题,‌带您一窥IP地址背后的奥秘。‌ 一台电脑对应一个IP地址吗?‌

git如何灵活切换本地账号对应远程github的两个账号

git如何灵活切换本地账号对应远程github的两个账号 问题: 有时候我们会同时维护两个github的账号里面的仓库内容,这时候本地git需要频繁的切换ssh,以方便灵活的与两个账号的仓库可以通信。这篇日记将阐述我是怎么解决这个问题的。1. 第一个账户 生成本地SSH2. 注意 我们要设置第二个账户的 本地 SSH 时3. 两个账号来回切换 问题: 有时候我们会同时维护两个git

Python 错误 TypeError 解析,实际错误实例详解 (五)

文章目录 前言TypeError:‘DataFrame’ object is not callable 错误常见的错误发生场景一、错误地使用小括号而非方括号来访问列二、意外地将函数名覆盖为 DataFrame三、 在方法链中错误地使用小括号 小结 Python 中错误 TypeError: 'NoneType' object is not subscriptablePython 中的 Non

一台笔记本电脑的硬件都有哪些以及对应的功能

一台笔记本电脑的硬件通常包括多个关键组件,这些组件共同协作,确保电脑的正常运行。以下是笔记本电脑的主要硬件及其功能: 1. 中央处理器(CPU) 功能:CPU 是电脑的“大脑”,负责处理所有的计算和指令执行。它执行操作系统和应用程序的指令,控制其他硬件设备。常见品牌:Intel(如 Core i3/i5/i7/i9)、AMD(如 Ryzen 系列)。 2. 内存(RAM) 功能:内存用于存

两个月冲刺软考——逻辑地址与物理地址的转换(例题+讲解);文件类型的考点

1.已知计算机系统页面大小和进程的逻辑地址,根据页面变换表(页号-物理块号),求变换后的物理地址。 首先介绍几个公式: 逻辑地址 = 页号 + 页内地址 (默认为32机位) 物理地址 = 物理块号 + 物理地址的页内地址 其中:页内地址 = 物理地址的页内地址 解题:由于页面大小为4K,即4K=2的12次方,占0~11位;也就是页内地址有12位,故十六进制数中的C28是页内地址,那

堆(逐个添加元素创建堆)-堆结构的创建+堆结构的实际应用

一、问题引入 一堆数据的值在不断变化,我们想要从这堆数据中获取到最大值或者最小值(比如电影排行榜中电影的排名,每部电影观看人数越多,那么该部电影的排名就越高) 1、数据结构解决的是数据的存储问题,算法解决的是存储了的数据的使用效率问题 2、数据结构里面的堆结构(heap)和Java语言中的数据堆不一样 3、数据结构里面的堆结构本质上是数组 4、数组的元素查询效率高(由于使用索引查询),时

Spring是如何找到URL请求对应的Controller的

文章来源 原文作者:Spring MVC 原文地址: https://blog.csdn.net/hl233211/article/details/77450697 http://ddrv.cn/a/58528 本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。 序:先贴一张SpringMVC整体的框架原理图 此文主要描述Spring在响应请求的时候是如何根据U

基于实际业务场景下的Flume部署

点击上方蓝色字体,选择“设为星标” 回复”资源“获取更多资源 大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 暴走大数据 点击右侧关注,暴走大数据! 有这样一个场景,我们要基于某个web服务实时持续收集用户行为数据; 再实施方案前,我们做了以下的准备工作 (不细说) web服务端部署nginx,用于收集用户行为并有形成log (172.17.111.111)我们数据平台是部

halcon 的图像坐标转到实际的机械坐标的标定

所谓手眼系统,就是人眼睛看到一个东西的时候要让手去抓取,就需要大脑知道眼睛和手的坐标关系。如果把大脑比作B,把眼睛比作A,把手比作C,如果A和B的关系知道,B和C的关系知道,那么C和A的关系就知道了,也就是手和眼的坐标关系也就知道了。 相机知道的是像素坐标,机械手是空间坐标系,所以手眼标定就是得到像素坐标系和空间机械手坐标系的坐标转化关系。 在实际控制中,相机检测到目标在图像中的像