1.地址映射是搞得我最懵逼的地方,我也不知道我现在看懂没,先写上吧,有错误再改。

地址映射涉及到访问内存,访问外设(寄存器)啊。。。。不搞清楚,真的是程序看不懂。

2.首先物理地址吧。声明一下,龙芯3A3000启动就是使用虚拟地址。

2.1 上图《user1.pdf》

这个图片显示龙芯支持48位地址,但是实际只用了44位(单芯片的情况下)

44位能访问的空间也是足够大了,16TB。(这是内存空间,应该目前够用了吧。硬盘的空间不占用在这个地址范围哈。)

每一片龙芯3A3000的物理地址范围地址就是0-0xfff,ffff,ffff 共16T

44位的最高位,为0表示共享Cache模块

为1 表示4个方向的端口设备。(如下图,只有两个端口(6,7)有效,4,5已省略。)

其中[42:41] 还要进一步划分为4个部分(结合[44],总共划分8个部分)。如下图:

HT用于连接桥片(我的是7A1000),或者多片3A3000互联

根据实际的原理图,我的连接是在HT1上,所以访问桥片的物理地址是0xe00,0000,0000开始的地址。

2.2 一级XBAR和二级XBAR

这是龙芯的特色,机会都会涉及到这个话题。

这个图中,一级XBAR每个master(共有6个master)有8个地址窗口,每个窗口有3个64位寄存器,分别位BASE,MASK,MMAP

还有命中公式(重要):输入的地址 & MASK 要与BASE相等才行,否则就是没命中。

注意:

2.3 有XBAR之后,7A1000的桥片地址也一同映射。

这个是《7A1000user.pdf》中的截图。

这里5个区域使用了一级XBAR进行映射。主要都是桥片的地址。

在2.1节中,我们看到桥片的空间就是要0xe00开头的这样44位的地址(使用HT1桥接口)

以下我只是根据印象猜测,可能仍不正确请多多指教:

比如图中的1,当cpu准备访问0x1000,00xx的时候,XBAR会自动转为0xe00,1000,00xx这样的地址(转换是有规则的!!!后面讲),实际访问的也是后面的这个地址。其他依次类推。

注意,这里仍然是物理地址。

3.虚拟地址,这也必须要用啊。

龙芯3A3000使用64位虚拟地址。这里需要说的是cpu一开始就是使用的虚拟地址。(其中有一段是不需要MMU参与地址转换的)。

0xbfc0,0000   --> 对应的物理地址正好是0x1fc0,0000. 这是启动地址,无需MMU参与。

之前接触的arm,在没有使能mmu之前,使用的是物理地址,使能之后,使用的是虚拟地址。

而龙芯是没使能mmu,也能使用部分虚拟地址。

3.1首先分用户态和核心态,用户态访问受限,核心态无限制。

kuseg : 0x00000000 ------ 0x7fffffff (2G)      user space
kseg0 : 0x80000000 ------ 0x9fffffff (512M)    unmapped, cached
kseg1 : 0xa0000000 ------ 0xbfffffff (512M)    unmapped, uncached
kseg2 : 0xc0000000 ------ 0xffffffff (1G)      mapped,   cached

在32位CPU下(32位早于64位设计,后来64位出来之后,仍然要兼容32位cpu),程序地址空间划分为4个大区域。每个区域有一个传统的名字。对于在这些区域的地址,各自有不同的属性:

kuseg: 虚拟空间0x0000 0000 - 0x7FFF FFFF (低端2G):这些地址是用户态可用的地址。在有MMU的机器里,这些地址将一概被MMU作转换,除非MMU的设置被建立好,否则这2G地址是不可用的。对于没有MMU的机器,存取这2G地址的方法依具体机器相关,你的CPU具体厂商提供的手册将会告诉你关于这方面的信息。如果想要你的代码在有或没有 MMU的MIPS处理器之间有兼容性,尽量避免这块区域的存取。

kseg0: 虚拟空间0x8000 0000 - 0x9FFF FFFF(512M): 这些地址映射到物理地址简单的通过把最高位清零,然后把它们映射到物理地址低段512M(0x0000 0000 - 0x1FFF FFFF)。因为这种映射是很简单的,通常称之为“非转换的”地址区域。几乎全部的对这段地址的存取都会通过快速缓存(cache)。因此在cache设置好之前,不能随便使用这段地址。通常一个没有MMU的系统会使用这段地址作为其绝大多数程序和数据的存放位置。对于有MMU的系统,操作系统核心会存放在这个区域。

kseg1: 虚拟空间0xA000 0000 - 0xBFFF FFFF(512M): 这些地址通过把最高3位清零的方法来映射到相应的物理地址上,与kseg0映射的物理地址一样。但kseg1是非cache存取的。kseg1是唯一的在系统重启时能正常工作的地址空间。这也是为什么重新启动时的入口向量是0xBFC0 0000。这个向量相应的物理地址是0x1FC0 0000。你将使用这段地址空间去存取你的初始化ROM。大多数人在这段空间使用I/O寄存器。如果你的硬件工程师要把这段地址空间映射到非低段512M 空间,你得劝说他。

kseg2: 虚拟空间0xC000 0000 - 0xFFFF FFFF (1G): 这段地址空间只能在核心态下使用并且要经过MMU的转换。在MMU设置好之前,不能存取这段区域。除非你在写一个真正的操作系统,一般来说你不需要使用这段地址空间。

综上可以看到,MIPS32 CPU下面的不经过MMU转换的内存窗口只有kseg0和kseg1 的512M的大小,而且这两个内存窗口映射到同一512M的物理地址空间。其余的3G虚拟地址空间需要经过MMU转换成物理地址,这个转换规则是由CPU 厂商实现的。还句话说,在MIPS32 CPU下面访问高于512M的物理地址空间,必须通过MMU地址转换。

在核心态下(CPU启动时),CPU可以作任何事情。在用户态下,2G之上的地址空间是非法的,任何存取将会导致系统异常处理。注意的是,如果一个 CPU有MMU,这意味着所有的用户地址在真正访问到物理地址之前必须经过MMU的转换, 从而使得OS可以防止用户程序随便乱用。对于一个没有内存映射的OS,MIPS CPU的用户态其实是多余的。在核心态下,CPU可以存取低段地址空间,这个存取也是通过MMU的转换。

3.2下面来谈谈MIPS64 CPU的虚拟地址空间。

64位CPU的地址空间的最低2G和最高2G区域是和32位情况下一样的,64位扩展的地址部分在这两者之间。64位下那些大块的不需要MMU转换的窗口可以克服kseg0和kseg1 512M的局限,但是32位下我们可以通过对MMU编程来同样达到这一点。

在这个图中,右边出现的字母n表示结点号,我实际只有1个节点,所以n等于0;

0x90开头的虚拟地址(不使用cache的方式)和0x98开头的虚拟地址(使用cache的方式)可以映射整个物理地址空间,大小为2T(44位中还有3位要拿出来做设备选择,剩下41位)

除了这两段之外,0xffff,ffff,8000,0000开始的那段地址的映射,与32位映射一致,只是(32转64的时候)高位补充的是符号位。

3.3 用户空间0x0-0x7fff,ffff,ffff这段需要MMU映射才能使用。

PMON阶段不使用,此时处于内核态。但是仍然会初始化TLB,为操作系统的使用做准备

4.cpu访问地址空间的行为

CPU拿到地址(虚拟地址),其转换过程如下步骤:
(1) 判断当前是kernel mode还是user mode
(2) 如果是kernel mode
      (A) 访问的地址是kuseg或者kseg2,进行 TLB 查找;如果查找不成功,exception。如果查找成功,得到物理地址
      (B) 如果访问的地址是 kseg0/kseg1,不进行TLB 查找;通过减去一个偏移量得到物理地址
(3) 如果是user mode
      (A) 访问地址kuseg,进行TLB 查找。如果查找不成功,exception。如果查找成功,得到物理地址
      (B) 访问kseg0/1/2,exception

单龙芯3A3000-7A1000PMON研究学习-(17)撸起袖子干-分析代码前的准备工作4-地址映射相关推荐

  1. 单龙芯3A3000-7A1000PMON研究学习-(14)撸起袖子干-分析代码前的准备工作2

    1.我细细回想一下,感觉要准备的东西很多. 比如体系结构,汇编指令,地址映射,外设.... 然而,光体系结构就复杂到要用n页(官方的)pdf才能说清楚(其实不一定能说清楚,可能还得慢慢去琢磨).这里还 ...

  2. 单龙芯3A3000-7A1000PMON研究学习-(16)撸起袖子干-分析代码前的准备工作3-寄存器

    1.这篇还是稍微介绍一下cpu相关的寄存器. 手册里面说到的寄存器分两种,一种是cpu使用的(汇编中用来存放数据的),另一种是外部设备寄存器(一般用于配置功能,或者读写外部设备数据用的.),在手册中都 ...

  3. 单龙芯3A3000-7A1000PMON研究学习-(12)撸起袖子干-分析代码前的准备工作1

    1.make的过程我说了个大概,大家可以参考一下前面的文章.现在准备分析代码吧,其实这个准备工作内容应该蛮多的.可能后面还要补充. 2.首先找到关键的bin文件啊,就是可以最终下载到flash,能启动 ...

  4. come type6 定义_COMe-B6101龙芯3A3000 COM Express Type6模块

    COMe-B6101是一款以龙芯3A多核处理器和AMD RS780E SB710芯片组为核心,高可靠性和高效能的主板模块.COMe-B6101 内部集成ATI M72-based图像引擎,支持双屏显示 ...

  5. 龙梦拿下3万片大单 龙芯电脑年底量产无悬疑

    10月9日,龙芯有关人士通过搜狐博客透露,"龙梦电脑已经有人拿到货,批量生产在11月15日以后,因为量产的芯片11月15日才到."这与龙梦科技此前关于"龙芯电脑年底量产& ...

  6. 单龙芯3A3000-7A1000PMON研究学习-(19)撸起袖子干-再来一杯代码3

    1.start.S包含一个独立的pcitlb.S文件 ##########################################     PRINTSTR("NO TLB cach ...

  7. 单龙芯3A3000-7A1000PMON研究学习-(8)撸起袖子干-make tgt=rom初步分析(a)

    1.make tgt=rom 开始编译了. 在zloader.3a3000_7a目录下的Makefile.inc,指定了我们要的目标. tgt = rom. 所以就是执行73行的rom这个目标. 这里 ...

  8. 单龙芯3A3000-7A1000PMON研究学习-(11)撸起袖子干-make tgt=rom的编译过程

    1. 今天来分析一下makefile,看看如何编译出执行文件pmon的. 先贴几张图,makefile的内容,这是一些依赖关系 图一 图二 图三 图四 图五 2.图一解释 rom这个目标又三个依赖,c ...

  9. 走进龙芯3A3000(四)安装XFCE4

    我想要安装KDE 我想要qtwebengine的MIPS64实现.曾经读过千里孤坟的<KDE综览>,就深深喜欢上了KDE,当时的版本还是KDE3.后来KDE4发布,千里孤坟又写了<K ...

  10. Linux内核4.10在龙芯3A3000笔记本上的移植

    http://ask.loongnix.org/?/article/66 http://ask.loongnix.org/?/article/67 http://ask.loongnix.org/?/ ...

最新文章

  1. Redis 预防缓存穿透“神器” — 布隆过滤器
  2. 关系型数据库之Mysql备份(五)
  3. 张量功率谱CAMB参数调试
  4. svn添加钩子hook
  5. CVPR 2019 论文和开源项目合集(Papers with Code)
  6. [自己动手]让Editplus更好用
  7. java 防止反射_Java设计模式(一):单例模式,防止反射和反序列化漏洞
  8. 中动态路径加载_GOT段在linux系统中实现代码动态加载的作用和其他段的说明
  9. 网络分析仪-inSSIDer
  10. PostgreSQL高可用性、负载均衡、复制与集群方案介绍
  11. bzoj 3609: [Heoi2014]人人尽说江南好(博弈)
  12. 2个区别搞懂web.xml配置Session超时时间
  13. linux将pdf转txt,如何快速把PDF转换成TXT
  14. 中国矿业大学本科毕业设计Latex模板cumtthesis
  15. IPC网络高清摄像机基础知识1(IPC芯片市场分析以及“搅局者”华为海思 “来自2013年”)
  16. 苹果cms10好看的模板自适应高端大气免费模板
  17. android国外壁纸app,听说在国外很火?Action安卓启动器体验
  18. WKWebView 设置 UserAgent
  19. MATLAB实现红眼消除(数字图像处理)
  20. 火车票改签退票规则,儿童票规则

热门文章

  1. 感觉中国程序员前景一片灰暗,是这样吗?
  2. elementui 做删除,分页页码不正确
  3. 怎么把EXCEL内的十六进制数进行两位两位倒序排列
  4. word字间距怎么调整成一样的【word教程】
  5. 芯片可靠性测试要求及标准解析
  6. SAR图像超分辨技术
  7. SAP-FI-财务报表版本设定
  8. SpringMVCfrom:form表单标签和input表单标签简介
  9. 采用晶体管作为电子元器件的计算机属于,采用晶体管作为电子元器件的计算机属于(...
  10. flag计算机语言的意思,flag是什么意思-c语言flag的用法