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

相关文章

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin

Maven pom.xml文件中build,plugin标签的使用小结

《Mavenpom.xml文件中build,plugin标签的使用小结》本文主要介绍了Mavenpom.xml文件中build,plugin标签的使用小结,文中通过示例代码介绍的非常详细,对大家的学... 目录<build> 标签Plugins插件<build> 标签<build> 标签是 pom.XML

在VSCode中本地运行DeepSeek的流程步骤

《在VSCode中本地运行DeepSeek的流程步骤》本文详细介绍了如何在本地VSCode中安装和配置Ollama和CodeGPT,以使用DeepSeek进行AI编码辅助,无需依赖云服务,需要的朋友可... 目录步骤 1:在 VSCode 中安装 Ollama 和 CodeGPT安装Ollama下载Olla

linux环境openssl、openssh升级流程

《linux环境openssl、openssh升级流程》该文章详细介绍了在Ubuntu22.04系统上升级OpenSSL和OpenSSH的方法,首先,升级OpenSSL的步骤包括下载最新版本、安装编译... 目录一.升级openssl1.官网下载最新版openssl2.安装编译环境3.下载后解压安装4.备份

解读docker运行时-itd参数是什么意思

《解读docker运行时-itd参数是什么意思》在Docker中,-itd参数组合用于在后台运行一个交互式容器,同时保持标准输入和分配伪终端,这种方式适合需要在后台运行容器并保持交互能力的场景... 目录docker运行时-itd参数是什么意思1. -i(或 --interactive)2. -t(或 --

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Spring Cloud Hystrix原理与注意事项小结

《SpringCloudHystrix原理与注意事项小结》本文介绍了Hystrix的基本概念、工作原理以及其在实际开发中的应用方式,通过对Hystrix的深入学习,开发者可以在分布式系统中实现精细... 目录一、Spring Cloud Hystrix概述和设计目标(一)Spring Cloud Hystr

Keepalived+Nginx双机配置小结

《Keepalived+Nginx双机配置小结》本文主要介绍了Keepalived+Nginx双机配置小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1.1 软硬件要求1.2 部署前服务器配置调优1.3 Nginx+Keepalived部署1.3

nginx upstream六种方式分配小结

《nginxupstream六种方式分配小结》本文主要介绍了nginxupstream六种方式分配小结,包括轮询、加权轮询、IP哈希、公平轮询、URL哈希和备份服务器,具有一定的参考价格,感兴趣的可... 目录1 轮询(默认)2 weight3 ip_hash4 fair(第三方)5 url_hash(第三

Python中conda虚拟环境创建及使用小结

《Python中conda虚拟环境创建及使用小结》本文主要介绍了Python中conda虚拟环境创建及使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录0.前言1.Miniconda安装2.conda本地基本操作3.创建conda虚拟环境4.激活c