【转载】WINCE物理和虚拟地址的问题
转载自:http://www.cnblogs.com/andyhere/archive/2008/10/23/1318105.html
WINCE物理和虚拟地址的问题
在MAP.A中地址映射表转换物理地址到虚拟地址
EXPORT OEMAddressTable[DATA]
; LTORG
AREA OEMAddressTable, DATA, READONLY
;OEMAddressTable
;;;-------------------------------------------------------------
;;; Virt Addr Phys Addr MB
;;;-------------------------------------------------------------
DCD 0x80000000, 0x00000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 0
DCD 0x82000000, 0x08000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 1
DCD 0x84000000, 0x10000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 2
DCD 0x86000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 3
DCD 0x88000000, 0x20000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 4
DCD 0x8A000000, 0x28000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 5
DCD 0x8C000000, 0x30000000, 64 ; 64 MB DRAM BANK 0
DCD 0x90800000, 0x48000000, 1 ; Memory control register
DCD 0x90900000, 0x49000000, 1 ; USB Host register
DCD 0x90A00000, 0x4A000000, 1 ; Interrupt Control register
DCD 0x90B00000, 0x4B000000, 1 ; DMA control register
DCD 0x90C00000, 0x4C000000, 1 ; Clock & Power register
DCD 0x90D00000, 0x4D000000, 1 ; LCD control register
DCD 0x90E00000, 0x4E000000, 1 ; NAND flash control register
DCD 0x91000000, 0x50000000, 1 ; UART control register
DCD 0x91100000, 0x51000000, 1 ; PWM timer register
DCD 0x91200000, 0x52000000, 1 ; USB device register
DCD 0x91300000, 0x53000000, 1 ; Watchdog Timer register
DCD 0x91400000, 0x54000000, 1 ; IIC control register
DCD 0x91500000, 0x55000000, 1 ; IIS control register
DCD 0x91600000, 0x56000000, 1 ; I/O Port register
DCD 0x91700000, 0x57000000, 1 ; RTC control register
DCD 0x91800000, 0x58000000, 1 ; A/D convert register
DCD 0x91900000, 0x59000000, 1 ; SPI register
DCD 0x91A00000, 0x5A000000, 1 ; SD Interface register
DCD 0x00000000, 0x00000000, 0 ; End of Table (MB MUST BE ZERO!)
END
针对一个ARM的处理器,它可以访问的物理空间是4GB。在WinCE中,ARM中的4GB物理地址空间将被映射为512MB的虚拟内存空间。OEMAddressTable就是一个4GB物理地址空间到WinCE Kernel中的512MB虚拟地址空间的映射表。上面的代码可以明显的看出确实将物理地址压缩在了512M以0X80000000为首地址的空间了。
在BSP中,会定义OEMAddressTable来描述系统中可访问的物理空间及对应的虚拟地址空间,还有大小。这个表会在WinCE系统开始启动的时候传给MMU,具体到BSP中应该是在OAL中的startup.s中,OEMAddressTable的
起始地址会被放到r0寄存器中,然后就跳转到KernelStart里面,KernelStart会用OEMAddressTable完成MMU
得初始化。当WinCE启动以后,就只能访问虚拟地址空间了。
但是,我在BSP中的S2440.H中看到的地址却和上面的物理地址不一样,比如:
#define PWM_BASE 0xB1100000 // 0x51000000
而在MAP.A中:
DCD 0x91100000, 0x51000000, 1 ; PWM timer register
一个是 0xB1100000 ,而在MAP.A中却是0x91100000,探究两者地址的规律发现,所有S2440.H的虚拟地址在MAP.A的虚拟地址基础上加了0X20000000。这个偏移量恰好是静态映射虚拟地址有缓存和无缓存的偏移良,MMU是靠MAP.A中的OEMAddressTable对地址映射进行初始化的,
OEMAddressTable介绍
一般在ARM架构的CPU上,物理地址都是统一编址的,寻址空间为4GB(32Bit CPU)。也就是说,针对一个ARM的处理器,它可以访问的物理空间是4GB。在WinCE中,ARM中的4GB物理地址空间将被映射为512MB的虚拟内存空间。 OEMAddressTable就是一个4GB物理地址空间到WinCE Kernel中的512MB虚拟地址空间的映射表。
在BSP中,会定义OEMAddressTable来描述系统中可访问的物理空间及对应的虚拟地址空间,还有大小。这个表会在WinCE系统开始启动的时候传给MMU,具体到BSP中应该是在OAL中的startup.s中,OEMAddressTable的起始地址会被放到r0寄存器中,然后就跳转到KernelStart里面,KernelStart会用OEMAddressTable完成MMU得初始化。当WinCE启动以后,就只能访问虚拟地址空间了。
举个例子,比如我们要开发一个Flash的驱动程序,那么首先我们知道这个flash所接的片选对应的物理起始地址是多少(假如是0x60000000),大小是多少(假如是0x2000000)。如果我们要在WinCE中访问它,就必须为它定义一个虚拟地址(假如是0x80000000),并添加到OEMAddressTable中,这样,我们才能在我们的驱动里面通过这个虚拟地址访问到flash。虚拟地址不是随便定义的,WinCE中有规定,必须在0x80000000---0x9FFFFFFF。实际上WinCE创建了两套虚拟地址空间,一个是0x80000000---0x9FFFFFFF,是Cache Enabled。另一个是0xA0000000---0xBFFFFFFF,是Cache Disabled。
有啥区别呢:如果我们访问的这个空间只是一段内存空间(比如SDRAM),那么就可以用Cache Enabled的空间来访问,这样存取数据的速度会比较快,因为数据被保存在Cache中。如果我们访问的这个空间是一个外设的地址,那么我们就要使用Cached Disabled的空间来访问,这样才能使CPU与外设同步。可能说得有点绕,我的经验就是:只要是SDRAM,可以用Cache Enabled空间访问。如果是寄存器,就用Cache Disabled空间访问。如何定义OEMAddressTable呢,如果安装了WinCE5.0或者6.0,那么提供的参考BSP中都已经有定义了,在BSP目录下搜索“OEMAddressTable”,一看代码就明白了,这里重复一下,格式如下:
虚拟地址 物理地址 大小
比如:
OEMAddressTable:
dd 0x80000000 0x60000000 0x2000000
dd 0 0 0
上面这个表定义了一个flash的物理地址到虚拟地址的映射,物理地址是0x60000000,虚拟地址是0x80000000,大小是32MB。
OEMAddressTable最后必须以0结尾,表示OEMAddressTable结束。
总之,说白了就是一张物理地址/虚拟地址映射表,当我们要在WinCE中要访问相关硬件的时候,查查这张表,然后通过虚拟
地址就可以访问了。如果没有定义,自己添加一个物理地址到虚拟地址的映射就好了。
转载于:https://www.cnblogs.com/hao507/articles/2216720.html
【转载】WINCE物理和虚拟地址的问题相关推荐
- WINCE的内存配置
WINCE的内存(包括SDRAM及FLASH)的配置包含两个方面:源代码(包括C和汇编)中的定义,及系统配置文件CONFIG.BIB中的定义.源代码中需要定义内存的物理及虚拟地址,大小,并初始化名为O ...
- wince内存配置(转gooogleman的工作日志)
WINCE的内存(包括SDRAM及FLASH)的配置包含两个方面:源代码(包括C和汇编)中的定义,及系统配置文件CONFIG.BIB中的定义.源代码中需要定义内存的物理及虚拟地址,大小,并初始化名为O ...
- WINCE的内存配置-config.bib文件的解析
WINCE的内存(包括SDRAM及FLASH)的配置包含两个方面:源代码(包括C和汇编)中的定义,及系统配置文件CONFIG.BIB中的定义.源代码中需要定义内存的物理及虚拟地址,大小,并初始化名为O ...
- 2017-2018-1 20155204 《信息安全系统设计基础》第十一周学习总结
2017-2018-1 20155204 <信息安全系统设计基础>第十一周学习总结 教材学习内容总结 9.1物理和虚拟地址 物理地址:计算机系统的主存被组织成一个人由M个连续的字节到校的单 ...
- 初探内核之《Linux内核设计与实现》笔记下
定时器和时间管理 系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务,推迟一段时间执行的任务),因此,时间的管理对于linux来说非常重要. 主要内容: 系统时间 定时器 定时器相关 ...
- linux audio device driver 音频设备驱动讲解
第十七章 Linux 音频设备驱动 本章导读 在Linux 中,先后出现了音频设备的两种框架OSS 和ALSA,本节将在介绍数字音频设备及音频设备硬件接 口的基础上,展现OSS 和ALSA 驱动的结构 ...
- Kernel Exception 问题分析详解
和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一.Kernel Exception概述 二.Kernel空间布局 三.printk 概述 四.AEE ...
- 十二、linux GPIO初始化
一.如何查看LINUX内核 很多人说学习linux最好的方法是看内核源码,那怎么看呢?总不能通篇看吧,那猴年马月都看不完.现在我就教大家一个办法(以GPIO为例): 在内核源码目录下使用命令" ...
- Kubernetes 下零信任安全架构分析
作者 杨宁(麟童) 阿里云基础产品事业部高级安全专家 刘梓溪(寞白) 蚂蚁金服大安全基础安全安全专家 李婷婷(鸿杉) 蚂蚁金服大安全基础安全资深安全专家 简介 零信任安全最早由著名研究机构 Forre ...
最新文章
- java中编写单选按钮的程序_java的单选按钮GUI程序设计
- C# OpenGL 环境配置和入门程序
- 【新星计划】MATLAB plot绘制图像
- C++ Primer这本书怎么样?
- CodeForces - 1420D Rescue Nibel!(组合数学+离散化)
- 【大数据】获取一篇新闻的全部信息
- Win7系统更换软件图标的详细方法
- 你离云计算还差一个云管平台(CMP)
- nodejs学习---1、命令行和环境变量
- [Delphi]怎样访问Internet Explorer中的WebBrowser
- SpringBoot 2.0.0 注入SpingCloud 有bug(目前只有SpringBoot 1.5+ 版本的支持)
- android studio程序开机启动,Android Studio中创建和启动AVD【Android】
- 搭建一个网站步骤 制作网页完整步骤
- centos 测试get请求_centos网速测试
- qiankun 2.x 运行时沙箱 源码分析
- 2021年机修钳工(中级)考试题库及机修钳工(中级)试题解析
- 洛谷--入门题 (1)
- [Docker]进入容器命令
- 【Devc++】双人跑酷小游戏1.3
- sendgrid_如何使用SendGrid提高WordPress电子邮件的可传递性
热门文章
- MB_SELECT_GR_BLOCKED_STOCK 读取物料收货冻结库存
- shell中字符串基本用法
- RESET MASTER和RESET SLAVE使用场景和说明,以及清除主从同步关系
- Ubuntu 安装配置Git过程记录
- iOS开发-多线程开发之线程安全篇
- gdbserver yum 安装_(OK) 编译cBPM—CentOS7—gdb—gdbserver—成功—调试
- 负载均衡策略_负载均衡策略
- 机器学习网站收集(to be continued)
- 2.Riesz定理及其应用
- 【AI2】app inventor2离线开发环境百度网盘下载链接,安卓app图形化开发环境