u-boot分析(十一)

  通过前面十篇博文,我们已经完成了对BL1阶段的分析,通过这些分析相信我们对u-boot已经有了一个比较深入的认识,在BL2阶段大部分是对外设的初始化,并且有的我们已经分析过,在这篇博文我打算对BL1阶段没有分析到的重要外设进行简单分析,并结束对u-boot的分析,同时对后面自己的博文进行简单的规划,希望有兴趣的朋友跟我一块学习和研究嵌入式。

今天我们会分析到以下内容:

1.      MMU分析(内容出自我以前的博客)

2.      裸机开发总结

3.      后期学习规划

MMU分析

1.       MMU作用

MMU就是负责虚拟地址(virtual address)转化成物理地址(physical address)。

2.       基本概念

下面我来说一下ARM CPU上的地址转换过程涉及三个概念:虚拟地址(VA)(CPU内核对外发出VA),变换后的虚拟地址(MVA)(VA被转换为MVA供cache和MMU使用,在此将MVA转换为PA),物理地址(PA)(最后使用PA读写实际设备)。

1.      CPU看到的用到的只是VA,CPU不管VA最终是怎样到PA的。

2.      cache、MMU也是看不到VA的,它们使用的是MVA(VA到MVA的转换是由硬件自动完成的)。

3.      实际设备看不到VA、MVA,读写设备使用的是PA物理地址。

3.       如何地址转换

在此过程中要用到以下两个必备的东西:

1.      cp15协处理器的c2寄存器(这个里面的东西需要程序员自己装载)

2.      虚拟地址MVA。

接下来我说以下mmu对虚拟地址到物理地址的转化过程。

1.        无论进行那种有效转换都必须进行一级页表的转换,所以我们先去产生一级页表。产生一级页表经过以下步骤

a)        由协处理器CP15中的寄存器C2(高18位,即[31:14]为转换表基地址,低14位为0)为一级转换表基地址,即TTB该地址指向了一个2^14=16KB大小的存储区,即一级转换表。

b)        将MVA的高12位,即位[31:20]作为一级转换表的地址索引,因此一级转换表具有2^12=4096项,这4096项的位,最高的18位[31:14]为寄存器C2的高18位,中间12位为MVA的高12位[31:20],最低2位为0b00。这4096项中的内容称为一级描述符。至此一级页表产生完毕。

2.        mmu拿到一级描述符首先看它的后两位也就是bits[1:0],根据这两位的取值mmu会进入不同的转换模式,这两位会出现下面四种取值。其中这四种取值分别对应四种模式,下面我一一解释。

a)        00          无效不进行转换

b)        01          进行粗页式转换

c)        10          进行段式转换

d)        11          进行细页式转换

3.        接下来对于不同的转换模式,就要进行不同的转换。我下面将对三种转换模式进行一一分析。

a)        0b10(段式转换),把段式转换放在第一个说的原因是在ARM中大量用到了段式和细页式转换。

段式转换是最简单的一种转换方式,它是将我们刚才产生的项中的内容)的高12位作为段的基地址,用MVA的低20位作为每个段的偏移量,由此我们可以轻松的推出每个段的大小为2^20=1MB,至此我们就得到了一个物理地址PA。

b)        0b11(细页式转换)

细页式转换,它是将我们刚才产生的位bits[31:12],再加上MVA的bits[19:10](第二级表索引)合体,bits[1:0]补0,获取第二级描述符的地址,至此其一级转换结束,因为其二级转换方式和粗页式的二级转换方式相同所以我下面一块分析。

c)        0b01(粗页式转换)

粗页式转换,它是将我们刚才产生的位bits[31:10],再加上MVA的bits[19:12](第二级表索引)合体,最后两位补0,获取第二级描述符的地址(32位),至此其一级转换结束。

4.        下面我们将进入二级转换,对于二级转换只针对细页式和粗页式,没有段式转换。

a)        经过一级转换我们得到了二级描述符的地址,我们通过此地址可以得到二级描述符,我们根据二级描述符的低两位bits[1:0]同样可以分为四种转换模式:

i.              00            无效不进行转换

ii.              01            大页描述符

iii.              10            小页描述符

iv.              11            极小页描述符

b)        接下来我将对各个模式进行分析。

i.              01(大页描述符)

此时我们取出位的物理地址,这就是MVA对应的PA。

ii.              10(小页描述符)

此时我们取出位的地址,这就是MVA对应的PA。

iii.              11(极小页描述符)

此时我们取出位的地址,这就是MVA对应的PA。

裸机开发总结

在前十篇博文中我们分析了整个u-boot的工作流程,并对其中重要的代码和外设进行了分析,对于嵌入式的外设是相当多的,我们要全部分析的话是不太现实的,所以我们应该在学习中总结方法,下面我将自己对于裸机的方法跟大家进行分享,不足之处还望大家互相交流。

1)        熟悉外设大体工作原理,比如我们在前几篇博文中首先分析的就是该外设的工作原理,这些工作原理以及运作方式大部分都可以在该外设的手册中找到相应的说明。

2)        从该外设的芯片手册中找到其控制方法,比如时序图,通信方式等等可控制信息。

3)        从我们使用的控制芯片中找到有没有专门为此外设提供的控制接口,比如我们以前说到的内存控制器、串口控制器、nand控制器等。

4)        从控制芯片手册中找到其对该外设提供的控制方式,比如控制流程等信息。

5)        检查硬件连接方式,确定管脚等信息

6)        根据从外设芯片得到的所需要的控制信息,配置我们控制芯片所提供的控制信息,得到所需数据。

7)        根据6)得到的内容进行代码的编写。

8)        编译调试(这个过程可以用到串口、示波器、万用表、j-link等进行调试)

以上就是自己简单总结的外设裸机开发步骤,有很多不足之处,希望各位提宝贵意见。

后期学习规划

通过对u-boot的分析,我们对arm裸机的开发有了一定认识,在接下来我会去分析linux中的各种子系统、驱动模型等内容,整个过程必然很困难,自己只是进行简单的分析,有不足之处还请各位大神及时指导,让我们向内核进军。

u-boot分析(十一)----MMU简单分析|u-boot分析大结局|学习规划的更多相关文章

  1. 【Spring Boot】创建一个简单的Spring Boot的 Demo

    走进Spring Boot 文章目录 走进Spring Boot 环境搭建 新建Spring Boot项目 开始创建项目 配置JDK版本 和 Initializr Service URL 配置Proj ...

  2. 《深入实践Spring Boot》阅读笔记之三:核心技术源代码分析

    刚关注的朋友,可以回顾前两篇文章: 基础应用开发 分布式应用开发 上篇文章总结了<深入实践Spring Boot>的第二部分,本篇文章总结第三部分,也是最后一部分.这部分主要讲解核心技术的 ...

  3. Linux内核分析— —构造一个简单的Linux系统MenuOS(20135213林涵锦)

    Linux内核分析— —构造一个简单的Linux系统MenuOS 实验内容 Linux内核的启动过程,从start_kernel到init进程启动 使用实验楼的虚拟机打开shell cd LinuxK ...

  4. spring boot实战(第十三篇)自动配置原理分析

    前言 spring Boot中引入了自动配置,让开发者利用起来更加的简便.快捷,本篇讲利用RabbitMQ的自动配置为例讲分析下Spring Boot中的自动配置原理. 在上一篇末尾讲述了Spring ...

  5. awk命令分析日志的简单笔记

    awk是一个文本分析工具,可以用来进行流量日志分析 之前无意中看到了这个命令,简单记一下笔记 ,在打线下的时候可能会有用 awk有3个不同版本: awk.nawk和gawk,未作特别说明,一般指gaw ...

  6. 用ELK搭建简单的日志收集分析系统【转】

    缘起 在微服务开发过程中,一般都会利用多台服务器做分布式部署,如何能够把分散在各个服务器中的日志归集起来做分析处理,是一个微服务服务需要考虑的一个因素. 搭建一个日志系统 搭建一个日志系统需要考虑一下 ...

  7. 三行代码实现.NET MVC统计显示页面的执行时间 超简单的实现方法 分析页面执行效率

    三行代码实现.NET MVC统计显示页面的执行时间 超简单的实现方法 分析页面执行效率    博客页脚处添加了页面执行时间统计显示,如下图所示,也可以直接查看网页页脚处. 实现方法非常简单,只需三行代 ...

  8. jmeter之登录接口的一次简单压测与分析

    前言:登录接口的一次简单压测与分析 1.接口文档 2.配置元件 3.结果分析 1.接口文档 a.拿到接口文档 接口地址:http://localhost:8080/jpress/admin/login ...

  9. 简单的c程序分析

    1.裸函数 c语言的普通函数中即使什么都不写,编译器在编译时也会给它加上一些汇编代码:比如开栈.返回等: 裸函数就是编译器什么都不管,一切都需要自己来处理: 裸函数的优点是自由度高,可以应用在钩子程序 ...

随机推荐

  1. virturalenv 虚拟环境

    一.window系统 1.virtualenv的使用 2.pycharm使用 环境变量,path的作用:命令行中执行的命令,他们的路径,必须在path路径中,如果命令行找不到该命令,就是说path没写 ...

  2. spring boot 加载配置 文件

    在springboot启动的过程中,默契情况下会在classpath路径下加载application.properties当做系统配置文件,但有时候我们想要替换成另一个文件,可以 通过以下方式:   ...

  3. HTML5拖拽——将本地文件拖拽到网页中显示

    HTML5标准中的提供的用于文件输入输出(I/O)的对象 File: 代表一个文件对象 FileList: 代表一个文件列表,类数组对象 FileReader 用于从文件中提取内容 FileWrite ...

  4. C语言中变量、全局变量与变量的作用域

    什么是变量: 变量常量都是表征数据的一种形式:常量用来表示数据的值: 变量不仅可以用来表示数据的值:还可以用来存放数据:因为变量对应着一定的内存单元: 变量和常量必须先定义后使用. 变量名和常量名都是 ...

  5. 线段树 区间更新(更新区间[x,y]的值,再求任意区间[x,y]的和)

    #1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...

  6. day33 GIL锁 线程队列 线程池

    1.    全局解释器锁GIL Python代码的执行由Python虚拟机(也叫解释器主循环)来控制.Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行.虽然 Python 解释器中可 ...

  7. 缓存算法及Redis、Memcached、Guava、Ehcache中的算法

    https://my.oschina.net/ffy/blog/501003 https://yq.aliyun.com/articles/622757 https://blog.csdn.net/s ...

  8. python3 unittest数据驱动

    我们在自动化测试的时候,有没有遇到这样的问题?例如一个登录的接口要做自动化,会有很多case(用例),密码错误,密码正确这种.在继承unittest.TestCase的类中,凡是以“test”开头的方 ...

  9. IDEA修改git账号及密码的方法

    IDEA修改git账号及密码的方法: 1.file->settings->passwords 2.重启IDEA 3.执行一次提交或更新 当执行提交或更新之后,idea会自动提示输入账号.密 ...

  10. MAC环境下idea:maven+Spring+Dubbo+Zookeeper简单工程搭建

    : 一:安装软件:tomcatZookeeperDubbo+admin 二:工程: 总工程  API    Pom.xml:不用引用任何东西  Provider    Pom.xml:要denpend ...