bootz启动 Linux内核涉及do_bootm_linux 函数
一. bootz启动Linux
uboot 启动Linux内核使用bootz命令。当然还有其它的启动命令,例如,bootm命令等等。
本文只分析 bootz命令启动 Linux内核的过程中涉及的几个重要函数。具体分析 do_bootm_linux函数执行过程。
本文继上一篇文章,地址如下:
bootz启动 Linux内核涉及 bootm_os_get_boot_func 函数-CSDN博客
二. bootz 启动 Linux 内核涉及函数
2. do_bootm_linux 函数
经过前面的分析,我们知道了 do_bootm_linux 函数就是最终启动 Linux 内核的函数,此函数定
义在文件 arch/arm/lib/bootm.c,函数内容如下:
int do_bootm_linux(int flag, int argc, char * const argv[],bootm_headers_t *images)
{/* No need for those on ARM */if (flag & BOOTM_STATE_OS_BD_T || flag & BOOTM_STATE_OS_CMDLINE)return -1;if (flag & BOOTM_STATE_OS_PREP) {boot_prep_linux(images);return 0;}if (flag & (BOOTM_STATE_OS_GO | BOOTM_STATE_OS_FAKE_GO)) {boot_jump_linux(images, flag);return 0;}boot_prep_linux(images);boot_jump_linux(images, flag);return 0;
}
do_bootm_linux 函数:
第13行,如果参数flag等于BOOTM_STATE_OS_GO或者BOOTM_STATE_OS_FAKE_GO ,就行 boot_jump_linux 函数。
boot_selected_os 函数在调用 do_bootm_linux 时,会将 flag 设置为 BOOTM_STATE_OS_GO。
第 14 行,执行函数 boot_jump_linux,此函数定义在文件 arch/arm/lib/bootm.c 中,函数内容如下:
static void boot_jump_linux(bootm_headers_t *images, int flag)
{
#ifdef CONFIG_ARM64
..........
#elseunsigned long machid = gd->bd->bi_arch_number;char *s;void (*kernel_entry)(int zero, int arch, uint params);unsigned long r2;int fake = (flag & BOOTM_STATE_OS_FAKE_GO);kernel_entry = (void (*)(int, int, uint))images->ep;s = getenv("machid");if (s) {if (strict_strtoul(s, 16, &machid) < 0) {debug("strict_strtoul failed!\n");return;}printf("Using machid 0x%lx from environment\n", machid);}debug("## Transferring control to Linux (at address %08lx)" \"...\n", (ulong) kernel_entry);bootstage_mark(BOOTSTAGE_ID_RUN_OS);announce_and_cleanup(fake);if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len)r2 = (unsigned long)images->ft_addr;elser2 = gd->bd->bi_boot_params;.............kernel_entry(0, machid, r2);}
#endif
}
第 6 行,变量 machid 保存机器 ID。
如果不使用设备树,这个机器 ID 会被传递给 Linux 内核,Linux 内核会在自己的机器 ID 列表里面查找是否存在与 uboot 传递进来的 machid 匹配的项目,如果存在就说明 Linux 内核支持这个机器,则 Linux 就会启动!
如果使用设备树的话,这个 machid 就无效了,设备树文件中存有一个“兼容性”这个属性,Linux 内核会比较“兼容性”属性的值(字符串)来查看是否支持这个机器。
static void announce_and_cleanup(int fake)
{printf("\nStarting kernel ...%s\n\n", fake ?"(fake run for tracing)" : "");bootstage_mark_name(BOOTSTAGE_ID_BOOTM_HANDOFF, "start_kernel");
.............cleanup_before_linux();
}

第 28 行,如果使用设备树的话,r2 应该是设备树的起始地址,而设备树地址保存在 images
相关文章:
bootz启动 Linux内核涉及do_bootm_linux 函数
一. bootz启动Linux uboot 启动Linux内核使用bootz命令。当然还有其它的启动命令,例如,bootm命令等等。 本文只分析 bootz命令启动 Linux内核的过程中涉及的几个重要函数。具体分析 do_bootm_linux函数执行过程。 本文继上一篇文章,地址…...
ipad有必要用手写笔吗?性价比电容笔排行榜
随着技术的进步,各种新型的数字电子产品不断涌现。比如说,智能手机、ipad、电容笔之类的东西。但事实上,要将iPad的功能发挥到极致,我认为,这款电容笔,就必不可少的了。这就好像我们在ipad平板上书写东西&a…...
jmeter怎样的脚本设计才能降低资源使用
官网地址:Apache JMeter - Users Manual: Best Practices 1、用好断言 频繁的使用断言会加大资源的消耗,尽可能减少断言的使用,或者在使用的过程中断言数据文本尽量精简,断言内容尽量以status/code、msg/message来判断࿰…...
如何避免 IDEA 每次重启都index
如何避免 IDEA 每次重启都index 在 IntelliJ IDEA 中,可以通过以下几个步骤来避免每次重启时索引: 打开 File -> Settings 菜单。在左侧的菜单栏中选择 “Appearance & Behavior” -> “System Settings” -> “Synchronization”。 在右…...
ImagePreview查看gif图,关闭之后原图不动了
vant的ImagePreview查看大图,当查看的是gif图的时候,关闭查看大图弹窗,原图不动了,ios上几乎必现。 解决的方案是,监听onclose事件,在关闭的时候把原图的gif图地址重新设置一下就好了 sceneImg(url: stri…...
实现基于 GitLab 的数据库 CI/CD 最佳实践
数据库变更一直是整个应用发布过程中效率最低、流程最复杂、风险最高的环节,也是 DevOps 流程中最难以攻克的阵地。那我们是否能在具体的 CI/CD 流程中,像处理代码那样处理数据库变更呢? DORA 调研报告 DORA(DevOps Research &am…...
android关闭键盘方法
Android开发中经常会遇到隐藏键盘的需求,例如登录界面,输入账号密码后需要点击界面其它部位,隐藏键盘。为此,分享前几年自己使用的方法,最近亲自测试,仍然有效。 方法一、Window window getWindow(); Win…...
ACK 云原生 AI 套件:云原生 AI 工程化落地最优路径
作者:胡玉瑜(稚柳) 前言 在过去几年中,人工智能技术取得了突飞猛进的发展,涵盖了机器学习、深度学习和神经网络等关键技术的重大突破,这使得人工智能在各个领域都得到广泛应用,对各行各业产生了深远的影响。 特别值…...
工程企业管理软件源码-综合型项目管理软件
工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…...
stm32mp157中断简单应用
设置按键中断,按键1按下,LED亮,再按一次,灭 按键2按下,蜂鸣器响。再按一次,不响 按键3按下,风扇转,再按一次,风扇停 main.c #include "gpio.h" #include &…...
智慧机场数字孪生大屏升级智慧出行全方位服务
在宁波栎社国际机场的信息中心大楼内,一块大屏幕上展示了一座“数字孪生”机场。通过点击屏幕上的各个板块,可以实时查看现场情况,一旦出现突发状况,还可以立即启动闭环处置流程…… (图源自宁波机场) 在数…...
微信小程序 js中写一个px单位转rpx单位的函数
大家写东西自然还是会比较喜欢用rpx 但是 事实证明 在js中 还是px好用 因为很多单位交互的函数还是只返回px单位的 理论上将 750 rpx 是整个屏幕的宽度 那么 我们可以这样写一个函数 pxToRpx(px) {//获取整个屏幕的宽度单位 pxlet screenWidth wx.getSystemInfoSync().scree…...
第14章总结:lambda表达式与处理
14.1: lambada表达式 14.1.1:lambada表达式简介 无参数 package fourteen; interface SayhHi{ String say();//抽象方法接口 } public class NoParamDemo { public static void main(String[] args) { //无参数 …...
多尺度retinex图像去雾算法matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 clc; clear; close all; warning off; addpath(genpath(pwd)); rng(default)img_in im2doub…...
蓝桥等考Python组别十八级005
第一部分:选择题 1、Python L18 (15分) 运行下面程序,输入30,输出的结果是( )。 t = int(input()) if t < 30: print(0) else: print(t // 15 * 2) 4102030正确答案:A 2、Python L18 (15分)...
redis在linux系统的安装与使用
一、单机安装Redis。 1.安装redis依赖 在控制台输入 yum install -y gcc tcl2.上传安装包 下载好的安装包上传到/usr/local/src/ 上传方法: 1.确保你拥有Linux服务器的IP地址、用户名和密码。 2.在Windows上,打开命令提示符(Command Promp…...
PanoFlow:学习360°用于周围时间理解的光流
1.摘要: 光流估计是自动驾驶和机器人系统中的一项基本任务,它能够在时间上解释交通场景。自动驾驶汽车显然受益于360提供的超宽视野(FoV)◦ 全景传感器。 然而,由于全景相机独特的成像过程,为针孔图像设计…...
C# - 常用API
Assembly.GetCallingAssembly 方法 获取当前方法的调用程序集: Console.WriteLine("FirstMethod called from: " Assembly.GetCallingAssembly().FullName); Assembly.GetExecutingAssembly 方法 获取包含当前执行的代码的程序集: //获取当前执行的代码的程序集…...
新式茶饮品牌如何写出生活感软文
居民消费水平的提升使新式茶饮品牌的市场不断扩张,在竞争激烈的茶饮市场中,品牌提高知名度的主要方式之一就是软文营销,而生活感软文是茶饮软文中较为常见的类型,它能有效拉进品牌与消费者之间的距离,那么新式茶饮品牌…...
使用c++视觉处理----canny 边缘检测、sobel边缘检测、scharr 滤波边缘检测
使用c视觉处理canny 边缘检测、sobel边缘检测、scharr 滤波边缘检测 #include <opencv2/opencv.hpp>int main() {// 读取图像cv::Mat image cv::imread("1.jpg", cv::IMREAD_GRAYSCALE); // 转为灰度图像if (image.empty()) {std::cerr << "无法加…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法
使用 ROS1-Noetic 和 mavros v1.20.1, 携带经纬度海拔的话题主要有三个: /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码,来分析他们的发布过程。发现前两个话题都对应了同一…...
