笔记整理—uboot启动过程(3)栈的二次设置以及常用名词解析,BL1部分完

本文主要是介绍笔记整理—uboot启动过程(3)栈的二次设置以及常用名词解析,BL1部分完,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        前文说到了uboot的lowlevel_init都干了些什么,也就是经过了这项初期的低级启动,使得我们能在串口监视器上看见机器打印出的第一句话“OK”。当lowlevel_init结束后,uboot去做了另一件事情,那就是栈的再次设置。

        第一次栈设置发生在lowlevel_init之前,在SRAM中设置的栈,现在要做的是将栈移动到DDR中。(ARM 是满减栈)

_TEXT_PHY_BASE=0X33E00000

        TEXT意为代码段、PHY为物理、BASE为基地址,整句话的意思就是归定代码段的物理内存基地址的起始位置。

        因为满减栈的结构,这样就不会让1栈踩到uboot。DDR已经初始化,所以将栈移过去,SRAM的空间有限,不能溢出。

        uboot的启动过程其实就是一个往复的过程,但每一次的往复都实现了向上的过程,就如同刚刚说到栈二次初始化,从SRAM搬到了DDR中,这是一个螺旋向上的一个过程。

        再次潘多当前地址是否重定位,这次决定是否进行uboot的relocate。冷启动uboot第一部分(8k~16k),后面的大部队还在SD卡的某个扇区中存储着。

        结束判断开始进行重定位加载。

        重定位:1.确定SD卡通道,值在0xD0037488自生成,若为SD0,则值为0xEB000000,SD2为0xEB200000。

                        2.早在start.S前部分就确定了MMCSD启动,在重定位开始时跳转到mmcsd_boot中执行重定位。

                        3.正真的重定位开始于movi_bl2_copy(这是一个c函数)。

copy_bl2(2, MOVI_BL2_POS, MOVI_BL2_BLKCNT, CFG_PHY_UBOOT_BASE, 0)

                        函数解释:2表示通道2;MOVI_BL2_POS:Uboot的第二部分在SD卡的开始扇区,这个扇区必须烧录位置相同;MOVI_BL2_BLKCNT:Uboot长度占用的扇区数;CFG_PHY_UBOOT_BASE:重定位将Uboot复制到DDR的位置(0x33E00000)。

        解释一些经常用到的名词:

        什么是虚拟地址映射,将物理地址映射为虚拟地址,通过MMC在软件与硬件之间的一个层次,硬件与软件之间相互不知道对方的真实地址(通过映射可访问,挂载更多的硬件)。

        MMC:memory management unit内存管理单元,实现内存的管理(读/写/权限)与地址映射。MMU在CP15协处理器中,映射将通过映射表实现。

        地址映射的作用:访问控制。在编程时出现的segmentation fault段错误,实际就是MMC实现的,因为访问了不应该或者不能权限不同的内存地址(MMC可管理内存块的只读/写/可读/写/不可访问权限)。

        cache:cache的指令规则也要依靠MMU实现(快速去访问,去读取指令等)。

        enable_mmu:操作mrc读mcr写。Cx(0~15)寄存器:cp15的寄存器。

        C3:域访问控制器(Domain)有效位为32位,分16给区,2个位可表示4种级别。

        TTB(translation table base)转换表基地址,转换表分为两个部分:表索引(虚拟内存)和表项(物理地址)。

        通过索引得到真实地址,映射中(内存映射和管理以块为单位、看MMU与设置)。此处理器(S5PV210)支持三种大小:细表1k、4k粗表、1M段、无映射。

        真正的转换表由若干的转换表单元构成,每个单元负责1个内存块大小,一共负责0-4G(也就是32位的上限)空间。

        转换表放在内存中,放置时要求起始地址在内存中xx位对齐,转换表将TTB放在C2中,MMU工作自会去查表(mmu_table)。

        设置完成后enable MMU:c1的bit0设置为1。

        转换表可理解为一个数组,每一个元素就是一个表项,下标是索引。ARM段映射最小为4096个单元,最少要4096个数组元素进行填充,填充过程中将多个元素进行批量循环处理,以减少工作量。

.macro FL_SECTION_ENTRY base,ap,dc,cd

 

.word (\base<<20)|(\ap<<10)\(\d<<5)|(1<<4)|(\c<<3)|(\b<<2)(1<<1)
.endm

        \base<<20。其中<<10位为1k;<<20位位1M;意为以1M对齐基地址。

        \ap<<10。访问控制位。

        FL_SECTION_ENTRY。建立一个表项。

        将这个宏循环0x100次可以负责256M空间的单元映射。

0x00000000    base=0
0x00100000    base=1
......        ......
0x10000000    base=100

        并按照需求分配空间到0x1000(4G)内存空间完成分配。

        结果虚拟地址映射可以等于物理地址,可可以将某一物理地址分配在不相同的虚拟地址。如果uboot只将虚拟地址的0xc0000000后的256M映射到了DMC0的0x30000000的256M。所以uboot链接地址分配到0xc3e00000映射在物理地址的0x33e00000。

        再次设置栈:

        此次设置栈还在DDR中,但这次设置将会使位置合理(安全,不浪费,紧凑) 。

        满减栈:可用栈为2M~200K-0x1000的大小。

        uboot第一阶段的最后一步:start_armboot。

ldr pc, _start_arnboot

        将第二段uboot要干的事情进行远跳转。远跳转:与加载和运行(当前的)地址无关,只与链接地址有关。所以实现了从SRAM到DDR的跳转,uboot的第二阶段将会在DDR中进行。

        就此跳转到DDR中,代表下一步的代码将会在DDR进行处理,也就标志着uboot的第一阶段的完成(BL1),下一章将会开始于start_armboot部分的讲解(BL2)敬请期待。

这篇关于笔记整理—uboot启动过程(3)栈的二次设置以及常用名词解析,BL1部分完的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll