CPU底层寻址过程详解

10760阅读 0评论2017-01-15 luyunxm
分类:嵌入式

本文以freescale p2040系列硬件(cpu core e500mc)来说明硬件的寻址过程。

首先附上CCSR域配置划分图:

当处理器核e500mc(36-bit physical addr)要访问CPU线性(虚拟)地址virtual_addr时,首先进入的是MMU单元。假如三级页表操作没有错误,这个时候,CPU核已经将要访问的虚拟地址virtual_addr转换成了物理地址physical_addr,这个物理地址对e500mc核来看,就是个local_addr。然后CPU core根据CCSRBAR寄存器中指示的LAW窗口基地址(偏移0xC00开始),查找这个local_addr命中哪个LAWn(n0~31)。假设能够命中,这个时候,我们就知道这个地址对应的是什么接口控制器了。

下面先列出这个LAW结构(图中只列出3LAW,系统共有32LAW)

每个LAW窗口有三部分组成LAWn_HIGH,LAWn_LOWLAWn_ATTRIBUTE.

LAWn_HIGHBaseAddrHigh,如果系统开启了PAE(物理地址扩展),则这4bit为地址的

bit0~bit3;

LAWn_LOWBaseAddrLow,表示地址的地址的bit4~bit23;


LAWn_ATTRIBUTE: EN表示使能这个LAWTARGET_ID表示命中这个LAW的地址对应的外设

接口表示.

比如TARGET_ID0x00表示PCIe1 constroller,

0x01表示PCIe2 constroller,

0x10表示memory constroller

其他的TARGET_ID见下图

每个LAW所表示的地址范围为

(BaseAddrHigh + BaseAddrLow) ~ (BaseAddrHigh + BaseAddrLow) +2^(size+1)

local_addr落在这个区间时,表示命中这个LAW


经过LAW机制后,我们知道了要访问的地址是什么外设接口,然后系统将地址送到相应的接口:

假如LAW之后,我们命中的LAW指示本次要访问的targetmemory constrollerlocal_addr就被送到memory constroller。这个时候我只知道了是哪个接口,还不知道具体的外设地址(比如系统中有2DDR RAM),所以接下午需要的是将这个local_addr地址转换成外设地址,而这个是由OutBoundATMU窗口来完成的。

对于这个ATMU窗口,我没有找到其具体结构的资料:

我们根据LAW送过来的目的地址local_addr,查找这个ATMU窗口,看其是否命中BAR + WAR中描述的地址范围。如果命中,则从TAR中取出目标地址local_addrmap地址。

按照之前的假设,我们的目的地址是个Memory,则这里命中的是DDR memory controller memory map ( CCSRBAR + 0x0_8000)

DDR memory controller memory map 域的分布一览图如下:

如果ATMU窗口中的TAR给出的片选地址是0x8000,那么表示我们要访问的是CS0片选的内存

然后就是根据DDR_CS0_BANDS的起止地址和TAR给出的偏移地址信息来取得目标地址local_addr对应的外设memory上的地址,最终实现外设地址空间的访问。

DDR_CS0_BANDS的结构如下:

转载的朋友,最后这行信息不要遗漏了^_^

本文描述的信息是基于作者自身的理解,如有错误,或者表述不清楚的,欢迎指正:shaohui973@163.com


上一篇:gcc基础
下一篇:* DDR3详解(以Micron MT41J128M8 1Gb DDR3 SDRAM为例) 一