uboot、kernel启动过程分析

news2024/11/26 16:57:56

00、uboot的宏观启动

        第1种:bootROM读取SPL到片内RAM,SPL初始化DDR,SPL把uboot程序copy到DDR,uboot启动进行必要外设初始化、自我拷贝、重定位等。

        第2种:bootROM直接读取uboot的头部信息(IVT、DCD)将DDR初始化完成,bootROM拷贝uboot程序到DDR,uboot开始执行。

        uboot的启动设备有很多,由bootPin开关(类似于STM32的boot0和boot1引脚)决定bootROM从哪种设备启动(上电开始从哪种存储设备读取信息去执行)。

一、uboot的启动

  1. 设置CPSR寄存器,进入SVC模式,关闭中断irq、fiq;
  2. 设置SCTLR、VBAR寄存器,进行中断向量表重定位,向VBAR写入中断向量表的基地址0x87800000;
  3. 关闭MMU,关闭D-cache,cpu类型检查,进入__main开始板级初始化;
  4. 初始化内部定时器(类似于Cortex-M系列内核的滴答定时器);
  5. uboot拷贝自己到DDR高地址0x9FF47000处(产生地址偏移:0x9FF47000 - 0x87800000=0x18747000),让出空间给准备要加载的内核;
  6. uboot进行重定位,采用位置无关码(pc的相对偏移)访问Label,并且修改Label的内容:原Label内容+偏移0x18747000,这样就可以通过与pc的相对偏移访问到Label,取出Label的内容,也即取出真正要访问的函数或全局变量的地址(Label的内容=真正要访问的函数或全局变量的地址,可以通过反汇编去验证)。
  7. 再次重定位中断向量表重定位,向VBAR写入NEW中断向量表的基地址0x9FF47000;
  8. 初始化其他外设;
  9. uboot进入命令行模式等待或者直接尝试启动内核(bootz指令启动内核:主要传递内核镜像和设备树地址,如:bootz 80800000 - 83000000,内核地址0x80800000 ,设备树地址0x83000000);

二、kernel的启动

        内核启动前的要求:MMU off、D-cache off、I-cache = don’t care、如果支持设备树内核需要知道设备树的首地址;

        uboot要传递给内核的核心参数:bootargs(控制台参数、根文件系统位置等)、bootcmd(读取外部存储器的内核、设备树文件加载到DDR指定位置并启动);

        从arch/arm/kernel/vmlinux.lds下ENTRY(stext)内核入口,stext在arch/arm/kernel/head.S下:

1)处理器继续处于SVC,关闭所有中断,“内核详细的启动工作...”

2)内核启动函数:start_kernel -> “一系列详细过程...”-> reset_init :

     内部使用rcu锁调度器(区别读写锁,rcu读不会被写阻塞)

        a. pid=1:init进程

          init进程进行其他初始化工作:

          -注册控制台设备“ /dev/console”,作为标准输入,同时复制此文件描述符,同时作为标准输出、标准错误;

          -根据bootargs参数console(console=ttymxc0,115200)设置/dev/console对应的实际设备;

          -根据bootargs参数root(root=/dev/mmcblk1p2)挂载根文件系统,也可以通过nfsroot挂载网络文件系统;

          -根据bootargs参数init(init=/linuxrc),在根文件系统下查找init用户态进程/linuxrc,找不到,内核就会启动失败!

        b. pid=2:负责内核进程调度和管理的进程;

        c. pid=0:主进程演变为idle进程,相当于空闲任务;

---------------------------------------------------------------------------------------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/753545.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python详解(8)——进阶(2):初步算法

目录 🏆一、前言 🏆二、时间复杂度 🏆三、递推 🚩1.简介 🚩2.爬楼梯 🚩3、猴子吃桃 🏆四、递归 🚩1、简介 🚩2、递归求斐波那契数列 🚩3、递归求阶乘 &#x…

【Git】Git 拉取的快速方法(含项目示例)

文章目录 一、问题的提出二、问题的尝试解决 一、问题的提出 在我们之前的拉取中,速度可能比较慢,例如,我们要拉取CLIP的项目。 (ldm) rootI1385efcc2300601b29:/hy-tmp/latent-diffusion# pip install githttps://github.com/openai/CLIP.…

Redis 从入门到精通【进阶篇】之高可用集群(Redis Cluster)详解

文章目录 0. 前言设计目标核心概念 1. 架构设计和原理1.1. 数据分片2. 节点间通信6. 扩容和缩容 2. 总结3. Redis从入门到精通系列文章4. Redis Cluster面试题4.1. Redis Cluster如何进行扩容和缩容?4.2. Redis Cluster如何进行故障转移?4.3. Redis Clus…

【计算机视觉 | 图像分类】arxiv 计算机视觉关于图像分类的学术速递(7 月 14 日论文合集)

文章目录 一、分类|识别相关(10篇)1.1 Video-FocalNets: Spatio-Temporal Focal Modulation for Video Action Recognition1.2 Watch Your Pose: Unsupervised Domain Adaption with Pose based Triplet Selection for Gait Recognition1.3 YOLIC: An Efficient Method for Obj…

【JavaEE】HTTP请求的构造

目录 1、通过form表单构造HTTP请求 2、通过JS的ajax构造HTTP请求 3、Postman的安装和简单使用 常见的构造HTTP请求的方式有一下几种: 直接通过浏览器的地址栏,输入一个URL,就可以构造一个GET请求HTML中的一些特殊标签,也会触发…

【Linux】1、装机、装操作系统、部署

文章目录 一、装系统1.0 格式化 U 盘1.1 做启动盘1.1.2 rufus1.1.2 poweriso 1.2 安装步骤 二、恢复系统2.1 BootManager2.2 recovery mode 一、装系统 下载地址: http://old-releases.ubuntu.com/releases/16.04.5/ubuntu-16.04.5-server-amd64.isohttps://mirro…

基于STM32 ARM+FPGA伺服控制系统(二)软件及FPGA设计

完整的伺服系统所包含的模块比较多,因此无法逐一详细介绍,所以本章着重介绍 设计难度较高的 FPGA 部分并简单介绍 ARM 端的工作流程。 FPGA 部分主要有 FOC 算法、电流采样算法及编码器采样算法,是整个控制系统的基础,直接…

本地appserv外挂网址如何让外网访问?快解析端口映射

一、appserv是什么? AppServ 是 PHP 网页架站工具组合包,作者将一些网络上免费的架站资源重新包装成单一的安装程序,以方便初学者快速完成架站,AppServ 所包含的软件有:Apache[、Apache Monitor、PHP、MySQL、phpMyAdm…

好物推荐文案怎么写吸引人?纯干货

互联网上充斥着各种各样好物种草文,一不小心就跌入了软文的圈套中,好物推荐文案写得好,流量绝对少不了。 好物推荐文案怎么写吸引人?通过整理总结上百篇爆款种草文案,总结出一套超实用的文案写作妙招!纯干…

活动页服务端渲染探索

目标 通过采用在服务端渲染激励页的方式,降低页面加载白屏时间,从而提升激励 H5 渲染体验。 架构设计 前端服务框架调研选型 只对比分析以下两种方案: Vue3 Nuxt3 WebpackNext.js React Node.js ’Nuxt3Next.js介绍Nuxt是一个基于Vu…

flask实现get和post请求

1、实现get请求 在项目根目录创建app.py 代码如下: from flask import Flask,render_template,requestapp Flask(__name__)app.route("/regist/user/", methods[GET]) def regist():return render_template("regist.html") #默认去templat…

三维 GIS 引擎该用什么?结合目前主流引擎进行分析

相信大多数人在谈到三维 GIS 引擎时,第一个想到的首先是 CesiumJS,CesiumJS 以其免费开源的特点,快速占领了三维 GIS 这个领域,同时也催生了许多以 CesiumJS 为基础的衍生产品。CesiumJS 作为一个功能强大的 JavaScript 库&#x…

3ds Max 无插件制作燃烧的火焰动画特效

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 在 3ds Max 中对火焰进行动画处理 如果您能找到“大气装置”设置,这很容易做到。基本上,你选择一个“Gizmo”(BoxGizmo,SphereGizmo或CylGizmo)&…

HashMap的遍历方式及底层原理

目录 概述MapMap的全谱系图HashMapkey和value HashMap的四种遍历方式keySetvaluesentrySetIterator性能分析应用场景二维表 底层原理key是数值型key是字符类型 总结: 概述 Map Map是Java中的一个接口,它继承自Collection接口,定义了键值对的…

GB35114双向身份认证(A级)学习笔记

GB35114双向身份验证学习笔记 温故而知新 SSL单向认证 摘录自:https://blog.csdn.net/qq_45759354/article/details/128672828 SSL协议用到了对称加密和非对称加密,在建立连接时,SSL首先对对称加密密钥使用非对称加密。连接建立好后&…

Docker 安装 Nacos 单节点

Docker 安装 Nacos 单节点 1 搜索 Nacos2 下载 Nacos3 安装 Nacos Nacos(中文名“云注册中心和配置中心”)是一个用于动态服务发现、配置管理和服务管理的开源项目,它由阿里巴巴集团开发并开源。Nacos提供了一种简单而强大的方式来实现微服务…

自动化用例编写思路 (使用pytest编写一个测试脚本)

目录 一,明确测试对象 二,编写测试用例 构造请求数据 封装测试代码 断言设置 三,执行脚本获取测试结果 四,总结 经过之前的学习铺垫,我们尝试着利用pytest框架编写一条接口自动化测试用例,来厘清接口…

系统调用与函数调用有什么区别?

本文我们来聊聊系统调用与普通的函数调用之间的区别。 作为程序员你肯定写过无数的函数,假设有这样两个函数: void funcB() {} void funcA() { funcB();} 函数之间是可以相互调用的,这很简单很happy有没有。 要知道是代码、是函数就可以相…

ABAP 发送特定格式内容的邮件

项目中,经常会有需求,向客户,供应商发送邮件,但是会有一些格式上的要求。 我们一般使用长文本来处理此类需求 举例,客户需要发送一个如下邮件主体内容(带格式) Dear Customer, Attached is y…

相机图像质量研究(2)ISP专用平台调优介绍

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…