uboot启动流程图以及boot启动linux流程图

2023-11-10

运行厂商u-boot的前提:

运行u-boot,需要DDR或者DRAM,串口,SD卡驱动、EMMC、NAND,这些要和厂商的开发板一致,就能直接在自己板子上运行u-boot

开机流程:
当把u-boot.bin下载到SD卡上时,由于整个u-boot的起始地址为87800000,所以开始从SD卡启动IMX6ULL时,arm内核从sd卡中取指令,在DDR的87800000上运行u-boot,接着就是整个u-boot的启动流程,再通过bootcmd来自动从emmc中拷贝zImage和dtb根文件到指定地址的DDR中运行linux,bootz启动linux(其中分为从emmc启动linux,还是从网络tftp上启动linux),其中通过bootargs=console=ttymxc0,115200 root=/dev/mmcblk1p2, 来将参数告诉linux,让linux知道从imx6ull从ttymxc0串口与linux进行交互,并且设置115200波特率,且根文件系统要保存在/dev/mmcblk1p2(也就是emmc的第二个分区)。由于下载的zImage是压缩包,linux想要运行就必须先进行自解压缩,这就需要linux的第一行代码为kernel_entry(),它就是将linux进行解压的函数,在uboot的启动最后阶段会按照kernel_entry()的要求给其传入三个参数,在启动前做如下操作:

①、关闭 MMU。
②、关闭 D-cache。
③、 I-Cache 无所谓。
④、 r0=0。
⑤、 r1=machine nr(也就是机器 ID)。
⑥、 r2=atags 或者设备树(dtb)首地址。

一旦进入kernel_entry()函数,u-boot的使命结束,linux开始工作。

linux启动所做的工作:

1、确保CPU处于SVC模式且关闭所有中断,检查是否支持该CPU,验证设备树是否存在,使能MMU,调用 start_kernel 来启动 Linux 内核。(linux内核的第一阶段,接下来进入C语言)

2、未完待续。。。。

u-boot移植流程:(几个移植的重要文件)

mx6ull_14x14_evk_emmc_defconfig(添加开发板默认配置文件

uboot的configs 目录下有很多配置文件,可想而知,每一个配置文件就对应一块开发板。
我们找到 mx6ull_14x14_evk_emmc_defconfig, 这是nxp官方的配置文件,我们就是参考它做修改。

CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_my_emmc/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
CONFIG_ARM=y
CONFIG_ARCH_MX6=y
CONFIG_TARGET_MX6ULL_MY_EMMC=y
CONFIG_CMD_GPIO=y

mx6ullevk.h(添加自己开发板的头文件)

在include/configs 下拷贝mx6ullevk.h 并修改。

在这个头文件中有许多宏定义,这些宏基本用于配置uboot,也有一些I.MX6ULL 的配置项目。
如果我们想要禁用uboot的某些功能,在这个头文件中修改即可。

mx6ullevk.h 文件中基本都是“CONFIG_”开头的宏定义,这也说明 mx6ull_alientek_emmc.h 文件的主要功能就是配置或者裁剪 uboot如果需要某个功能的话就在里面添加这个功能对应的 CONFIG_XXX 宏即可,如果不需要某个功能的话就删除掉对应的宏即可。(在具体u-boot的启动流程中,会有ifdefine CONFIG_XXX ,则运行下面的代码,如果你没有定义或者删除改宏定义,则下面的代码就不会运行,相当与对u-boot进行了裁剪)

mx6ullevk.h 中包含了 mx6_common.h,如果没有在mx6ullevk.h中发现某个功能或命令,但uboot中又确实存在,可以去mx6_common.h 中寻找。


mx6ull_alientek_emmc(添加开发板对应的板级文件夹)

uboot中每一块板子都拥有一个板级文件夹,用来存放板级文件。比如开发板上的外设驱动文件等。

NXP 的 I.MX 系列芯片的所有板级文件夹都存放在 board/freescale 目录下,imx6ull 对应的板级文件夹是mx6ullevk。同样备份重命名。

进 入 mx6ull_alientek_emmc 目 录 中 , 将 其 中 的 mx6ullevk.c 文 件 重 命 名 为mx6ull_alientek_emmc.c

1、修改板级文件夹目录下的 Makefile 文件

将文件名修改为刚刚改的文件,这样才会编译mx6ull_my_emmc.c这个文件。

2、修改 imximage.cfg 文件

PLUGIN 这一项路径改成我们自己文件夹的路径。

3、修改 Kconfig 文件

4、修改 MAINTAINERS 文件

5、修改 U-Boot 图形界面配置文件

uboot 是支持图形界面配置

LCD 驱动修改

一般 uboot 中修改驱动基本都是在 xxx.h 和 xxx.c 这两个文件中进行的, xxx 为板子名称,比如 mx6ull_alientek_emmc.h 和 mx6ull_alientek_emmc.c 这两个文件。

一般修改 LCD 驱动重点注意以下几点:
①、 LCD 所使用的 GPIO,查看 uboot 中 LCD 的 IO 配置是否正确。
②、 LCD 背光引脚 GPIO 的配置。
③、 LCD 配置参数是否正确。

总结
①、不管是购买的开发板还是自己做的开发板,基本都是参考半导体厂商的 dmeo 板,而半导体厂商会在他们自己的开发板上移植好 uboot、linux kernel 和 rootfs 等,最终制作好 BSP包提供给用户。
我们可以在官方提供的 BSP 包的基础上添加我们的板子,也就是俗称的移植。
②、我们购买的开发板或者自己做的板子一般都不会原封不动的照抄半导体厂商的 demo板,都会根据实际的情况来做修改,既然有修改就必然涉及到 uboot 下驱动的移植。
③、一般 uboot 中需要解决串口、NAND、EMMC 或 SD 卡、网络和 LCD 驱动,因为 uboot的主要目的就是启动 Linux 内核,所以不需要考虑太多的外设驱动。
④、在 uboot 中添加自己的板子信息,根据自己板子的实际情况来修改 uboot 中的驱动。
 

u-boot启动流程 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uboot启动流程图以及boot启动linux流程图 的相关文章

  • 如何重命名共享库以避免同名冲突?

    我找到了一个图书馆 libjson http sourceforge net projects libjson 我正在尝试将其构建为共享库并在项目中使用 建造很简单 修复 Makefile 错误后 SHARED 1 make install
  • C中的内存使用问题

    请帮忙 操作系统 Linux 其中 sleep 1000 中 此时 top 显示Linux任务 给我写了7 7 MEM使用 valgrind 未发现内存泄漏 我明白 写得正确 所有 malloc 结果都是 NULL 但是为什么这次 睡眠 我
  • 使用 WGET 运行 cronjob PHP

    我尝试执行一个 cron 并每 5 分钟运行一个 url 我尝试使用 WGET 但我不想下载服务器上的文件 我只想运行它 这是我使用的 crontab 5 wget http www example com cronit php 除了 wg
  • 从命名管道读取

    我必须实现一个 打印服务器 我有 1 个客户端文件和 1 个服务器文件 include
  • 将用户添加到组但运行“id”时未反映

    R 创建了一个名为 Staff 的组 我希望能够在不以 sudo 身份启动 R 的情况下更新软件包 所以我使用以下方法将自己添加到员工中 sudo usermod G adm dialout cdrom plugdev lpadmin ad
  • :: 右侧的非法标记

    我有以下模板声明 template
  • 命令行参数中的“-”(破折号)有什么魔力?

    例子 创建 ISO 映像并将其直接刻录到 CD mkisofs V Photos r home vivek photos cdrecord v dev dev dvdrw 更改到上一个目录 cd 侦听端口 12345 并解压发送到该端口的数
  • 页面错误陷阱的成本

    我有一个应用程序 它定期 每 1 或 2 秒后 通过分叉自身来获取检查点 因此 检查点是原始进程的一个分支 它一直保持空闲状态 直到原始进程发生某些错误时被要求启动 现在我的问题是fork的写时复制机制的成本有多大 每当原始进程写入内存页面
  • 在 Linux 2.6.21 (glibc 2.3.5) 上进行 ARP 和反向 ARP

    我需要在任意 IP 网络上存储对第三方设备的持久引用 其中设备的 IP 地址可能是静态的或由 DHCP 随机分配 我不控制网络上的设备 也不能依赖 DNS 和其他现有的或与设备一起使用的临时网络协议 所以我被指示使用硬件地址和 ARP 进行
  • 从 gitlab docker runner 启动声纳扫描仪

    我有一个 CI 工作流程 集成了 linting 作业和代码质量作业 我的 Linting 工作是一个 docker runner 从应用程序代码启动我的 eslint 脚本 然后我的代码质量工作应该启动声纳扫描仪泊坞窗实例 检查我的代码并
  • 在 C 中使用 sqrtf():“未定义对‘sqrtf’的引用”

    我正在使用Linux Ubuntu 12 04 https en wikipedia org wiki Ubuntu version history Ubuntu 12 04 LTS 28Precise Pangolin 29 Precis
  • 如何真正释放 Linux 中的大页面以供新进程使用?

    真的找不到太多关于此的信息 希望有人可以提供帮助 我正在假脱机使用 100GB java 堆作为大数据缓存 为了避免与文件系统缓存等内容发生冲突 并且因为它通常性能更好 我将其分配在大页面中 我保留了 51 200 x 2MB 大页面 一切
  • 如何使用sprof?

    请举例说明 从邮件中找到here http sources redhat com ml libc alpha 2003 07 msg00029 html and here http sourceware org ml binutils 20
  • 在64位操作系统上以32位模式和64位模式编译ioctl函数的执行有什么不同?

    我有 64 位 Enterprise SuSE 11 我有一个应用程序 它打开 HIDRAW 设备并在其上操作 ioctl 函数以从该设备获取原始信息 如下所示 struct hidraw devinfo devinfo int fd op
  • 我在哪里可以学习如何使 C++ 程序与操作系统 (Linux) 交互

    我是一个 C 初学者 我想创建与操作系统交互的小程序 使用 Kubuntu Linux 到目前为止 我还没有找到任何教程或手册来让 C 与操作系统交互 在 PHP 中 我可以使用命令 exec 或反引号运算符来启动通常在控制台中执行的命令
  • 测试linux下磁盘空间不足

    我有一个程序 当写入某个文件的磁盘空间不足时 该程序可能会死掉 我不确定是否是这种情况 我想运行它并查看 但我的测试服务器不会很快耗尽空间 有什么办法可以嘲笑这种行为吗 看起来没有任何方法可以在 Ubuntu 中设置文件夹 文件大小限制 并
  • 使用 sed 将 old-link-url 替换为 new-link-url

    我正在 bash 中编写一个脚本 将 old link url 替换为 new link url 我的问题是 sed 由于斜杠而无法替换 url 如果我只输入一些文字就可以了 my code sed e s old link new lin
  • 变量作为 bash 数组索引?

    bin bash set x array counter 0 array value 1 array 0 0 0 for number in array do array array counter array value array co
  • 在 Ubuntu 上纯粹通过 bash 脚本安装 mysql 5.7

    我想要一个无需任何手动输入即可安装 MySQL 5 7 实例的 bash 脚本 我正在关注数字海洋教程 https www digitalocean com community tutorials how to install mysql
  • 在中断时获取 current->pid

    我正在Linux调度程序上写一些东西 我需要知道在我的中断到来之前哪个进程正在运行 当前的结构可用吗 如果我在中断处理程序中执行 current gt pid 我是否可以获得我中断的进程的 pid 你可以 current gt pid存在并

随机推荐

  • 服务器virsh不显示虚机,【openEuler 20.09】【虚拟化】virsh attach-interface热插rtl8139网卡后,虚拟机内部不显示,重启后才显示...

    环境信息 Host NAME openEuler VERSION 20 09 ID openEuler VERSION ID 20 09 PRETTY NAME openEuler 20 09 ANSI COLOR 0 31 Guest C
  • Python函数(def, return)

    函数 函数 Function 喂 给函数一些数据 它就能内部消化 给你 吐 出你想要的东西 这就像自动贩卖机 只不过贩卖机是喂点钱 吐出来一些吃的喝的用的东西 而Python函数则是喂各种各样的数据 吐出来各种各样的功能 函数定义 在Pyt
  • c#对字符串的各种操作

    1 字符串定义 2 在字符串后面追加字符串 3 获取字符串长度 4 截取字符串的一部分 5 字符串转为比特码 6 查指定位置是否为空字符 7 查字符串是否是标点符号 8 截头去尾 Trim 9 替换字符串 10 得到用单个字符串分隔字符串单
  • MT7688路由器 openwrt编译笔记

    Openwrt 19 07 4 路由器平台 MT7688 代码下载 git clone git git openwrt org openwrt git 或者更快的下载如下 git clone https gitee com mirrors
  • Java实现数据脱敏

    一 什么是数据脱敏 数据脱敏指的是某些敏感的信息通过脱敏规则进行数据的变形 实现敏感隐私数据的可靠保护 敏感数据包括 姓名 身份证号 手机号 银行卡号等信息 防止这些敏感数据在不安全的情况下使用 所以就要使用数据脱敏的技术 使用数据脱敏会在
  • 微服务,那些你该懂的知识(服务的注册和发现)

    微服务 微服务按照我个人的理解就是将众多的功能拆分成一个个子服务 其中以现在很流行的SpringBoot框架进行开发 再以SpringCloud方式进行部署 进而可以在SpringCloud的服务平台中对SpringBoot的一个个服务进行
  • 【算法】——归并排序的解析

    目录 1 归并排序的思想 2 归并排序的分析 3 内排序和外排序 1 归并排序的思想 归并是将两个或两个以上的有序表组合成一个新的有序表 假设初始序列含有n个记录 则可看成是n个子序列 每个子序列的长度为1 然后两两归并 得到 n 2 个长
  • cocos2d中的anchorPoint

    cocos2d中的anchorPoint 将该图片放置到屏幕左下方 CCSprite sprite CCSprite sprite Default png addChild sprite 生成的精灵放置在 0 0 也就是屏幕左下角 但是精灵
  • (springmvc)页面找不到静态资源文件Failed to load resource: the server responded with a status of 404 (Not Found)

    今天打算整理之前写的一个插件功能上传到github 新建一个java项目 项目使用的是spring mvc框架 然后再调试页面的时候发现找不到静态资源文件 如下图所示 于是我第一时间检查jsp上页面资源的路径 经过确认 发现路径是没有
  • line-height(行高)

    line height 行高 line height 行高 介绍 字体框 line height 行高 介绍 1 行高指的是文字占有的实际高度 2 通过line height来设置行高 3 行高可以直接指定一个大小 px em 4 也可以直
  • Unity WebGL三维地球

    1 支持arcgis 天地图 bingmap 谷歌地图 高德地图等影像加载 2 支持高程三维地形加载 3 支持在线 离线数据加载 4 支持unity坐标和经纬度坐标互相转换 5 支持fbx模型放置在地球上 6 支持倾斜摄影数据放置在地球上
  • C#从数据库中读取二进制流并生成文件

    下面以图片文件为例加以说明 从数据库表 图片存储 中读取ID为1的图片数据并生成图片文件 MySqlConnection conn new MySqlConnection Server localhost Database test cha
  • fff

    http www migucloud com vi0 109 3j KJ59CLFb6F9pvcJ1egcF cld450p FILENAME 54 cld450p mp4 duration 201 owner 109 path 109 3
  • linux 杀死进程失败,linux - Ubuntu关闭失败“ *杀死所有剩余进程…” - Ubuntu问答...

    问题描述 我已经重新安装了Ubuntu Server reboot 有效 但是在 Killing all remaining processes 步骤上关闭失败 我在用 sudo shutdown now 在失败之后 由 fail 指示 f
  • 【廖雪峰python入门笔记】函数

    1 函数 我们知道圆的面积计算公式为 S r 当我们知道半径r的值时 就可以根据公式计算出面积 假设我们需要计算3个不同大小的圆的面积 r1 12 34 r2 9 08 r3 73 1 s1 3 14 r1 r1 s2 3 14 r2 r2
  • 深入学习java源码之ArrayList.iterator()与ArrayList.listIterator()

    深入学习java源码之ArrayList iterator 与ArrayList listIterator 内部类的使用典型的情况是 内部类继承自某个类或实现某个接口 内部类的代码操作创建其的外层类的对象 所以你可以认为内部类提供了某种进入
  • php excel导入

    excel导入导出是我们做项目中经常用到的功能 那么 今天就来说说excel导入 一 类文件 二 调用代码
  • 使用 htmx 构建交互式 Web 应用

    学习目标 了解htmx的基本概念 特点和用法 并能够运用htmx来创建交互式的Web应用程序 学习内容 1 什么是htmx htmx是一种用于构建交互式Web应用程序的JavaScript库 它通过将HTML扩展为一种声明性的交互式语言 使
  • 深入webpack打包原理,loader和plugin的实现

    本文讨论的核心内容如下 webpack进行打包的基本原理 如何自己实现一个loader和plugin 注 本文使用的webpack版本是v4 43 0 webpack cli版本是v3 3 11 node版本是v12 14 1 npm版本v
  • uboot启动流程图以及boot启动linux流程图

    运行厂商u boot的前提 运行u boot 需要DDR或者DRAM 串口 SD卡驱动 EMMC NAND 这些要和厂商的开发板一致 就能直接在自己板子上运行u boot 开机流程 当把u boot bin下载到SD卡上时 由于整个u bo