itop-4412启动流程小结 - 从iROM code运行到内核启动

2024-06-07 22:48

本文主要是介绍itop-4412启动流程小结 - 从iROM code运行到内核启动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. iROM code(无源码) 
    1.1 关闭看门狗 
    1.2 关闭中断和MMU 
    1.3 关闭D-cache,打开I-cache 
    1.4 FLush TLB’s and Invalidate caches 
    1.5 初始化IRQ和SVC模式的栈 
    1.6 初始化ZI/RW 
    1.7 注册函数指针? 
    1.8 得到重启状态 
    1.9 设置时钟分频和锁相环 
    1.10 根据OM引脚状态选择引导设备 
    1.11 拷贝BL1到iRAM并判断是否拷贝成功 
    1.12 校验和 
    1.13 验证BL1完整性 
    1.14 解译BL1 
    1.15 跳转到BL1

  2. BL1(无源码) 
    2.1 初始化IRQ和SVC栈 
    2.2 判断引导设备 
    2.3 从拷贝BL2到iRAM 
    2.4 进行一些判断决定是否跳转到BL2 
    2.5 验证BL2完整性,验证正确就跳转到BL2

  3. BL2 
    3.1 初始化IRQ和SVC模式的栈(各个模式都有各自独立的栈) 
    3.2 设置时钟频率 
    3.3 初始化内存 
    3.4 将OS镜像拷贝到DRAM,验证完整性后跳转。

  4. uboot 
    start.S: 
    4.1 跳转到reset 
    4.2 将cpu设置为svc模式,并关闭IRQ和FIQ中断(为什么设置为svc模式,因为svc特权模式可以访问的硬件资源最多,其次uboot要跳转到kernel之前,CPU必须处于svc模式) 
    4.3 初始化TLB和I-cache 
    4.4 禁能MMU和caches 
    4.5 读取引导信息,判断引导设备 
    4.6 跳转到lowlevel_init(配置pll, mux, memory(因为要将uboot后续代码拷贝到DRAM,所以要先初始化)) 
    4.6.1 初始化DDR内存 
    bl mem_ctrl_asm_init_ddr3(这个函数在cpu_init.S中实现) 
    4.7 判断是够已经拷贝过uboot 
    4.8 根据引导设备执行不同的拷贝函数 
    4.9 拷贝完成后跳转到after_copy处 
    4.10 使能MMU,设置TTB 
    4.11 初始化栈,清除bss段(初始化C语言环境) 
    4.12 跳转到start_armboot函数,在/lib_arm/board.c中 
    4.13 完成一些初始化工作后,进入死循环 
    for(;;) 

    main_loop(); 

    4.14 main_loop: 
    4.14.1 s = getenv (“bootcmd”); 获取引导命令 
    4.14.2 如果延时大于等于零,并且没有在延时过程中接收到按键,则引导内核 
    if (bootdelay >= 0 && s && !abortboot (bootdelay)) 
    run_command(s, 0); 
    4.14.2.1 abortboot中会检查延时是否大于等于零并且是否有按键按下,如果延时大于零并且停止引导内核标记没有被赋值则进入延时循环,直到延时完成或者接收到按键。 
    1. 延时完成且无按键按下,进入内核,即运行 run_command(s, 0),也就是运行”bootcmd”命令行参数所定义的值 
    2. 延时期间按键按下,进入uboot命令行

如何去寻找bootcmd命令行参数所定义的值? 
1. getenv (“bootcmd”) 
2. env_get_addr(val) 
3. default_environment(数组) 
4. CONFIG_BOOTCOMMAND(对其进行查找引用) 
5. smdkc210.h(y:/include/configs) 
6. #define CONFIG_BOOTCOMMAND “nand read 40008000 80000 380000;bootm 40008000”

最后,分析这两个uboot命令: 
nand read 40008000 80000 380000 将flash 0x8000起始地址处,拷贝0x380000长度的数据(即内核镜像)到内存0x40008000起始处 
bootm 40008000 执行内存0x40008000地址处的代码,即启动到内核(见于笔记“内核驱动 - U-Boot命令”)

这篇关于itop-4412启动流程小结 - 从iROM code运行到内核启动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是