uboot启动第一阶段--start.S代码分析笔记(3)

Exynos4412 Uboot 移植(二)—— Uboot 启动流程分析 U-Boot 属于两阶段的Bootloader,第一阶段的文件为arch/arm/cpu/armv7 /start.S 和 board//lowlevel_init.S,前者是平台相关的,后者是开发板相关的。 uboot启动流程分析如下: 第一阶段: a -- 设置cpu工作模式为SVC模式 b -- 关闭中断,mmu,cache v -- 关看门狗 d -- 初始化内存,串口 e 阅读详情

uboot启动第一阶段–start.S代码分析笔记(2)



17. 重定位(2)-- 虚拟地址映射

虚拟地址映射详细描述

after_copy:

#if defined(CONFIG_ENABLE_MMU)
enable_mmu:
	/* enable domain access */
	ldr	r5, =0x0000ffff
	mcr	p15, 0, r5, c3, c0, 0		@load domain access register

	/* Set the TTB register */
	ldr	r0, _mmu_table_base
	ldr	r1, =CFG_PHY_UBOOT_BASE
	ldr	r2, =0xfff00000
	bic	r0, r0, r2
	orr	r1, r0, r1
	mcr	p15, 0, r1, c2, c0, 0

	/* Enable the MMU */
mmu_on:
	mrc	p15, 0, r0, c1, c0, 0
	orr	r0, r0, #1
	mcr	p15, 0, r0, c1, c0, 0
	nop
	nop
	nop
	nop
#endif
17.1 设置域访问
  • mcr指令定义:mcr p15, opcode_1, Rd, Crn, Crm, opcode_2,对于cp15,opcode_1永远为0,Rd为ARM的普通寄存器,Crn为cp15的寄存器,Crm一般为c0,opcode_2一般省略或设0。本指令作用为将Rd中数据写入Crn中。mrc指令定义也一样,但作用相反,是将Crn的内容读入Rd中。
  • cp15的c3寄存器在MMU状态下定义了 ARM 处理器的 16 个域的访问权限,c3寄存器共32位,每连续两位定义一个域的权限,00表示不允许访问,11表示不进行权限检查。
17.2 设置TTB(转换表)
  • _mmu_table_base 是整个TTB表的首地址,TTB定义在lowlevel_init.S 文件中第675行。整块表定义如下:
.macro FL_SECTION_ENTRY base,ap,d,c,b
	.word (\base << 20) | (\ap << 10) | \
	      (\d << 5) | (1<<4) | (\c << 3) | (\b << 2) | (1<<1)
.endm
.section .mmudata, "a"
	.align 14
	// the following alignment creates the mmu table at address 0x4000.
	.globl mmu_table
mmu_table:
	.set __base,0
	// Access for iRAM
	.rept 0x100
	FL_SECTION_ENTRY __base,3,0,0,0
	.set __base,__base+1
	.endr

	// Not Allowed
	.rept 0x300 - 0x100
	.word 0x00000000
	.endr

	.set __base,0x300
	// should be accessed
	.rept 0x400 - 0x300
	//.rept 0x350 - 0x300
	FL_SECTION_ENTRY __base,3,0,1,1
	.set __base,__base+1
	.endr

	// Not Allowed
	//.rept 0x400 - 0x350
	//.word 0x00000000
	//.endr

	// DRAM - DMC1 area - used for STL_write : djpark (20090729)
	.set __base,0x400
	// should be accessed
	.rept 0x500 - 0x400
	FL_SECTION_ENTRY __base,3,0,1,1
	.set __base,__base+1
	.endr

	.rept 0x800 - 0x500
	.word 0x00000000
	.endr

	.set __base,0x800
	// should be accessed
	.rept 0xb00 - 0x800
	FL_SECTION_ENTRY __base,3,0,0,0
	.set __base,__base+1
	.endr

	.set __base,0xB00
	.rept 0xc00 - 0xb00
	FL_SECTION_ENTRY __base,3,0,0,0
	.set __base,__base+1
	.endr

	.set __base,0x300
	// 80MB for SDRAM with cacheable
	.rept 0xd00 - 0xC00
	//.rept 0xC50 - 0xC00
	FL_SECTION_ENTRY __base,3,0,1,1
	.set __base,__base+1
	.endr

	// Not Allowed
	@.rept 0xD00 - 0xC80
	@.word 0x00000000
	@.endr
	
	// Not Allowed
	//.rept 0xD00 - 0xC50
	//.word 0x00000000
	//.endr

	.set __base,0xD00
	// 1:1 mapping for debugging with non-cacheable
	.rept 0x1000 - 0xD00
	FL_SECTION_ENTRY __base,3,0,0,0
	.set __base,__base+1
	.endr
  • .macro伪指令定义宏,base,ap,d,c,b都是参数,FL_SECTION_ENTRY是宏名,该宏通过这几个参数构造了TTB的表项。
  • .rept与.endr构成了循环体,.rept后的数表示循环次数,.set伪指令为变量赋值。上面共8个循环体定义了地址从0x00000000-0xFFFFFFFF的转换表。结果如下:
虚拟地址物理地址大小允许访问
0x00000000-0x0FFFFFFF0x00000000-0x0FFFFFFF256MB读/写
0x10000000-0x1FFFFFFF----256MB读/写
0x20000000-0x5FFFFFFF0x20000000-0x5FFFFFFF1GB读/写
0x60000000-0x7FFFFFFF----512MB读/写
0x80000000-0xAFFFFFFF0x80000000-0xAFFFFFFF768MB读/写
0xB0000000-0xBFFFFFFF0xB0000000-0xBFFFFFFF256MB读/写
0xC0000000-0xCFFFFFFF0x30000000-0x3FFFFFFF256MB读/写
0xD0000000-0xFFFFFFFF0xD0000000-0xFFFFFFFF768MB读/写
  • uboot设置的虚拟地址是以段(1MB)为单位的,关于TTB内容如下,每个单位32bit,具体内容如下:
31 : 2019 : 1211 : 1098 : 54321:0
section base addressSBZAPSBZdomainIMPCB1 0
  • section base address存放了虚拟地址转化后的物理地址基址。
  • AP表示访问权限,11表示可读/写。
  • bit[3:2](C,B),控制cache和buffer,若C=1,将此地址存入cache中,若B=1,则通过写缓冲方式写此地址的数据。
  • 最后两位如果是10就表示1MB段虚拟映射。
17.3 小结

从上可以发现,只有虚拟地址为0xC0000000-0xCFFFFFFF最后映射到了可以读写的DRAM地址(0x30000000-0x3FFFFFFF)中,所以Uboot代码链接地址为0xC3E00000。

17.4 9-15行代码

该段将TTB物理基地址设置到了c2协处理器的寄存器中,中间的过程是将uboot代码中TTB的虚拟地址掐头,与物理地址组合后形成TTB的物理地址。

17.5 18-25行代码

该段开启了MMU。

18. 386-398行代码(第三次设置栈)

stack_setup:
#if defined(CONFIG_MEMORY_UPPER_CODE)
	ldr	sp, =(CFG_UBOOT_BASE + CFG_UBOOT_SIZE - 0x1000)
#else
	ldr	r0, _TEXT_BASE		/* upper 128 KiB: relocated uboot   */
	sub	r0, r0, #CFG_MALLOC_LEN	/* malloc area                      */
	sub	r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo                        */
#if defined(CONFIG_USE_IRQ)
	sub	r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
	sub	sp, r0, #12		/* leave 3 words for abort-stack    */

#endif

这次是最后一次设置栈,比之前又更为合理,sp的地址为CFG_UBOOT_BASE + CFG_UBOOT_SIZE - 0x1000 ,其中,CFG_UBOOT_BASE 为0x33E00000,CFG_UBOOT_SIZE 为 2 * 1024 * 1024。

19. 400-409行代码(初始化bss段)

clear_bss:
	ldr	r0, _bss_start		/* find start of bss segment        */
	ldr	r1, _bss_end		/* stop here                        */
	mov 	r2, #0x00000000		/* clear                            */

clbss_l:
	str	r2, [r0]		/* clear loop...                    */
	add	r0, r0, #4
	cmp	r0, r1
	ble	clbss_l

20. 411行代码(执行BL2)

ldr	pc, _start_armboot

这句话是uboot的第一阶段与第二阶段的分界点,至此,uboot跳转到第二阶段在DRAM中运行。

Uboot-5(U-Boot源码分析1-启动第一阶段) 来源:朱有鹏老师的嵌入式linux核心教程 1、start.S引入; 2、start.S解析1; 3、start.S解析2; 4、start.S解析3; 5、start.S解析4; 6、start.S解析5; 7、start.S解析6; 8、start.S解析7; 9、uboot重定位详解; 10、start.S解析8; 11、start.S解析9; 12、start.S解析10; 13、start.S解析11 阅读详情

相关推荐

一目了然uboot的start.S流程

版本信息: u-boot-2010-06

u013686019的专栏 1691

u-boot mmu映射分析

参考:https://www.cnblogs.com/yangjiguang/p/7647801.html 一、映射过程详解 关于页表:ARMv6的MMU进行地址映射时涉及到两种页表,一级页表(first level page table)和二级页表(coarse page table)。 关于映射方式:映射方式有两种,段映射和页映射。段映射只用到一级页表,页映射用到一级页表和二级页表...

coolperl的博客 1981

uboot,start.S汇编文件分析

uboot中start.S文件分析

【ARM】虚拟地址映射理解

1、关于虚拟地址和物理地址: 物理地址(记为PA)是设计生产的时候确定的,是一种硬件编码生产的物理地址。虚拟地址对于操作系统或者软件层面来说的。虚拟地址与物理地址之间有一个虚拟地址转换层建立了一个从虚拟地址映射到物理地址的映射表(也就是映射原理中所说的页表)。物理地址是根据具体需求来确定大小的,通常情况下会比虚拟地址小。 例如:对于 32 为 ARM 处理器,最大寻址空间为 4GB(2^32)...

baidu_37973494的博客 3248

DAC8568实战指南:如何用STM32实现8通道DAC精准控制(附代码)

本文提供DAC8568与STM32结合的实战指南,详细解析8通道16位DAC的精准控制方法。内容涵盖硬件连接、SPI配置、驱动层构建、时序调试及多通道同步输出等关键步骤,并附有经过验证的HAL库驱动代码,帮助工程师快速解决实际项目中的通信与输出稳定性问题。

weixin_29175469的博客 745

TWR-K65F180M评估板:基于Cortex-M4的嵌入式原型开发实战指南

在嵌入式系统开发中,微控制器(MCU)是核心,而围绕其构建的硬件平台则是将想法转化为可工作原型的关键。Cortex-M4内核凭借其高效的流水线、DSP指令集和浮点单元,为实时控制与信号处理提供了强大的运算能力。其技术价值在于,能够在较低功耗下满足工业控制、物联网网关等场景对能效比的严苛要求。为了快速验证系统设计,开发者常使用成熟的评估板来规避底层硬件设计的风险,直接聚焦于应用开发。本文以恩智浦的TWR-K65F180M评估板为例,深入解析其基于**ARM Cortex-M4**内核的K65 MCU的硬件架构

weixin_33582311的博客 370

uboot启动分析第一阶段(start.S)

前面分析了启动脚本、Makefile、mkconfig,接下来就是uboot的start.S这个启动代码了,下面是本章的平台介绍: 单板:迅为4412开发板(Exynos 4412) SDRAM:1G EMMC:4GExynos 4412的启动过程可以在数据手册的Booting Sequence找到,下面只截取关键部分: Exynos 4412 has 64 KB ROM (iROM) a

itdo_just的博客 8270

英飞凌TLF35584 SBC实战:手把手教你配置WDG看门狗与ERR监控(基于AUTOSAR架构)

本文详细介绍了基于AUTOSAR架构的英飞凌TLF35584 SBC芯片WDG看门狗与ERR监控功能的配置方法。通过硬件平台搭建、寄存器级配置、AUTOSAR模块集成及诊断策略优化,帮助开发者快速掌握关键配置技巧,提升嵌入式系统的安全性和可靠性。

weixin_30256901的博客 476

uboot之第一阶段start.S讲解

/* *Memory Setup stuff - taken from blob memsetup.S * *Copyright (C) 1999 2000 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl) and *                     Jan-Derk Bakker(J.D.Bakker@its.tudelft.nl) * *Modifi...

lilijianqun的博客 596

Hopfield神经网络(HNN)详解

Hopfield神经网络是一种比较特殊的网络,它不像一般的神经网络那样有输入层和输出层,并且通过训练来改变神经网络中的参数,最终实现预测、识别等功能。Hopfield网络只有一群神经元节点,所有节点之间相互连接,形式如下: 虽然有些文章会画出像深度神经网络那样有输入输出的图,并且输出后又返回输入,但本质上就是多个节点之间的全连接,也就是上面的图形。Hopfield神经网络主要有两个应用:一是起到类似储存器的作用,也就是我们把多个序列或图片输入这个网络,最终这个网络会以神经元之间连接权重的形式储存这

weixin_60737527的博客 4万+

UE5 蓝图节点图文大全(300+蓝图,9万字+)

本文采用虚幻5.2.1版本,以图文的方式对蓝图节点进行介绍,包括蓝图节点的输入输出参数解释,并有中英文节点名称可参考。

一碗清深的博客 2万+

uboot:源码分析-启动第一阶段-start.S解析

进入start.S文件中,发现57行中就是_start标号的定义处。

qq_43441284的博客 1473

【第07例】IPD体系进阶: 6 个技术评审点(TR)

TR技术评审点

产品线负责人 4415

嵌入式之uboot源码分析-启动第一阶段学习笔记

注: 以下的内容来自朱老师物联网大讲堂uboot部分课件 1. start.S引入 根据之前的学习经验我们知道,程序的运行肯定都要有一个入口,uboot的程序运行也是一样的,我们在裸机的部分知道了程序执行开始必须执行一段汇编代码进行相关的设定后(关看门狗、设置SVC栈、开/关icache、重定位等),才能调用C语言程序,所以这里我们要先找到汇编代码的入口。 1.1 u-boot.lds中找到start.S入口 (1)在C语言中整个项目的入口就是main函数(这是C语言规定的),所以譬如说一个有10000个

donke_dong 1813

【好物推荐】MQTTX 快速入门使用指南

摘要:MQTTX是一款跨平台MQTT客户端工具,支持MQTT 5.0/3.1.1协议,提供桌面版、网页版和CLI版本。本文介绍了快速入门指南,包括下载安装、核心概念解释、连接公共MQTT服务器(broker.emqx.io)的步骤,以及订阅主题、发布和接收消息的操作流程。文章还提供了常见问题排查方法,帮助用户快速完成MQTT开发调试的基本操作。

奶爸的编程之路,也就一周冷个三天 867

《自然语言处理实战入门》文本分类 ---- 使用词向量与SVM 进行文本分类

文本分类用电脑对文本集(或其他实体或物件)按照一定的分类体系或标准进行自动分类标记。 它根据一个已经被标注的训练文档集合, 找到文档特征和文档类别之间的关系模型, 然后利用这种学习得到的关系模型对 新的文档进行类别判断 。文本分类从基于知识的方法逐渐转变为基于统计 和机器学习的方法。

shiter编写程序的艺术 2388

uboot启动第一阶段--start.S代码分析笔记(1)

start.S代码分析笔记1. Uboot程序入口2. 28-39行代码(头文件包含)3. 49-54行代码(校验头)4. 56-83行代码(异常向量表)5. deadbeef(坏牛肉)6. 99-100行代码(链接地址)7. 107-108行代码(物理地址)8. 141-149行代码(复位函数入口,cpsr_c寄存器设置)9. 200-221行代码(刷新iCache,MMU)10. 225-22...

chegxy的博客 759

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Armv8架构UBOOT 启动篇——SPL(start.S)

前言 前面分析了spl-uboot lds的链接脚本,提到了_start符号是整个程序的入口,链接器在链接时会查找目标文件中的_start符号代表的地址,把它设置为整个程序的入口地址。并且我们也知道start.S的代码段也是位于整个spl-uboot代码段最开始的位置,而_start符号对于Armv8架构来说位于则位于 arch\arm\cpu\armv8\start.S文件内 ,接下来我们将重...

XingYu.Liao的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

海思(Hi3521a)uboot详细分析(5)——uboot启动第一阶段start.S文件分析

从《链接文件u-boot.lds分析》中我们看到链接脚本的代码段链接的第一个文件是arch/arm/cpu/hi3521a/start.o,也就是说程序运行最开始是从start.S文件开始执行的。 start.S在这里完成uboot的第一阶段的启动,它的内容包括: 设置CPU SVC模式 关闭mmu和缓存 启动流程判断 关闭地址重映射 使能指令缓存 重定向异常向量表到内.........

Biao 5586

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

uboot启动第一阶段--start.S代码分析笔记(2)

start.S代码分析笔记 start.S代码分析笔记13. 288行代码(CPU相关硬件初始化)14. 292-294行代码(开发板电源上锁)15. 297-299行代码(二次设置栈)16. 重定位(1)16.1 305-310行代码16.2 314-318行代码16.3 321-332行代码16.3 343-354行代码(mmcsd_boot) 13. 288行代码(CPU相关硬件初始...

chegxy的博客 676

uboot启动第一阶段详解——汇编代码部分start.S

前言 uboot启动第一阶段是用汇编语言实现的,大部分都是Soc内部的初始化,可以理解成一些通用的初始化,只要使用该款Soc,第一阶段的初始化流程基本是一样的。不直接用C语言进行初始化是因为,C语言运行需要一定的环境,比如栈的设置,而汇编代码刚好可以为C语言的运行初始化环境。在汇编代码的结束阶段就是跳转到C语言实现的函数继续进行初始化。 1、找到uboot的入口 uboot是个裸机代码,用汇编代码和C语言代码共同组成,和平时我们写的应用层的C语言程序不一样,uboot的入口不是main函数。uboot

weixin_42031299的博客 2812

UBOOT1.3.4 学习笔记(四) start.S文件详解--uboot第一阶段

整个项目的入口:start.S文件,由链接脚本的ENTRY声明确定 第一部分:头文件包含: #include <config.h> #include <version.h> #if defined(CONFIG_ENABLE_MMU) #include <asm/proc/domain.h> #endif #include <regs.h> #ifndef CONFIG_ENABLE_MMU #ifndef CFG_PHY_UBOOT_BASE #defin

csdnjianghu的博客 709

ARM uboot源码分析3-启动第一阶段

一、start.S 解析7 总结回顾:lowlevel_init.S 中总共做了哪些事情: 检查复位状态、IO 恢复、关看门狗、开发板供电锁存、时钟初始化、DDR 初始化、串口初始化并打印 ‘O’、tzpc 初始化、打印 ‘K’。 其中值得关注的:关看门狗、开发板供电锁存、时钟初始化、DDR初始化、打印"OK"。 1、再次设置栈(DDR 中的栈) (1) 再次开发板供电锁存。第一,做 2 次供电锁存是不会错的;第二,做 2 次则第 2 次无意义;做代码移植时有一个古怪谨慎保守策略:就是尽量添加代码而不

weixin_42109053的博客 1616

Uboot启动分析--start.S启动分析(1)

前面分析了spl-uboot lds的链接脚本,提到了_start符号是整个程序的入口,链接器在链接时会查找目标文件中的_start符号代表的地址,把它设置为整个程序的入口地址。并且我们也知道start.S的代码段也是位于整个spl-uboot代码段最开始的位置,而_start符号对于Armv8架构来说位于则位于 arch\arm\cpu\armv8\start.S文 start.s .globl _start _start: b reset _start函数的第一步指令就是跳转到reset函数,这个待

Muggle的博客 2131

6.uboot第一阶段 start.S代码分析

(1)config.h在include目录下,是配置过程中生成的文件,即mkconfig脚本中生成的,,这个文件的内容是包含了一个头文件:#include,这个头文件的内容是一堆宏定义,是跟uboot的配置相关,通过条件编译影响uboot的走向,使得uboot具有可移植性。

weixin_53762042的博客 1860

uboot——启动第一阶段分析

一、程序的开始   在C语言中,main函数是整个程序的入口,这是规定。在uboot中因为有汇编参与,因此不能直接找main.c,整个程序的入口取决于中ENTRY声明的地方 ENTRY(_start),因此_start所在的文件就是整个程序的起始文件,所在的程序就是起始程序。    二、Start.S文件的分析1、头文件包含#include <config.h> #include <versi

光阴跑走的博客 920
上一篇: uboot启动第一阶段--start.S代码分析笔记(2)
下一篇: uboot启动第二阶段--start_armboot函数分析(1)
chegxy
博客等级 码龄10年 55粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值