bootm调用流程

4.1uboot对设备树的支持——传递dtb给内核 本节讲述怎么把设备树(dtb)传给内核。uboot只要,然后在时,把这块内存的传给内核(通过寄存器)。 阅读详情

bootm调用流程

本文作为一个笔记,记录bootm启动的流程,参考版本:uboot 2021.01

在执行bootm之前,image已经从sd卡读到了内存中,这个要看uboot的参数,是从哪里读取读到哪里
下面的是qemu的下载命令:uboot的命令可以放在代码里面可以放在环境变量里面也可以放在文件里面,例如boot.scr。
fatload mmc 0 0xa1000000 uImage.lz4
fatload mmc 0 0xa8300000 uInitrd.lz4
fatload mmc 0 0xa8000000 kernel.dtb

bootm – 执行命令 : bootm 0xa1000000 0xa8300000 0xa8000000
do_bootm(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) – cmd/bootm.c
A. argc–; argv++; //去掉了命令参数中的argv[0],也就是bootm

	B.	// 如果states包含BOOTM_STATE_OS_GO此函数最终就会boot an OS, 那么这个函数就不会返回了,除非出错了。
		// 这里传入的States是0x71f,所以会执行很多子函数
		do_bootm_states(cmdtp, flag, argc, argv, states, &images, 1) -- common/bootm.c
			1.1	if (states & BOOTM_STATE_START)
					ret = bootm_start(cmdtp, flag, argc, argv);     -- common/bootm.c
						memset 全局变量images,image状态设置为start
						
			2.1	if (!ret && (states & BOOTM_STATE_FINDOS))
					ret = bootm_find_os(cmdtp, flag, argc, argv);    -- common/bootm.c
							2.1.1	boot_get_kernel  -- 读取image的64 bytes的头
									//获取image的内存地址,是在调用bootm之前,由其他程序把image读到内存中,不同的介质不同的读取方法。
									// 从bootm的参数里面获取这个image的地址,argv在do_bootm里面做了++
									img_addr = genimg_get_kernel_addr_fit(argc < 1 ? NULL : argv[0],&fit_uname_config, &fit_uname_kernel); 
									hdr = image_get_kernel(img_addr, images->verify);   获取image的头信息
										image_print_contents(hdr); -- 打印头信息,类似下面的信息:
											   Image Name:   Linux
											   Image Type:   RISC-V Linux Kernel Image (lz4 compressed)
											   Data Size:    4025467 Bytes = 3.8 MiB
											   Load Address: a0400000
											   Entry Point:  a0400000									
										image_check_dcrc(hdr)  -- crc校验image
									memmove(&images->legacy_hdr_os_copy, hdr, sizeof(image_header_t)); -- 拷贝头信息,避免解压的时间覆盖头信息
							2.1.2	根据上面获取到header信息设置images.os中的变量,类似下面的信息:
				走到这里kernel的所有信息都从header中获取了,如image类型,压缩类型,load地址,entry地址,size等等			
							
			3.1	if (!ret && (states & BOOTM_STATE_FINDOTHER))
					通过bootm的参数,试图获取有效的image,并把信息保存在images里面
					ret = bootm_find_other(cmdtp, flag, argc, argv);    -- common/bootm.c
						 boot_get_ramdisk  -- 获取ramdisk,保存ramdisk的信息,并打印如下:
							## Loading init Ramdisk from Legacy Image at a8300000 ...
							Image Name:   Initrd
						    Image Type:   RISC-V Linux RAMDisk Image (lz4 compressed)
						    Data Size:    5487619 Bytes = 5.2 MiB
						    Load Address: 00000000
						    Entry Point:  00000000
						    Verifying Checksum ... OK
						 boot_get_fdt    --  获取dtb,并打印如下:
							## Flattened Device Tree blob at a8000000
								Booting using the fdt blob at 0xa8000000

			4.1	/* Load the OS */
				if (!ret && (states & BOOTM_STATE_LOADOS)) {
					iflag = bootm_disable_interrupts();
					//主要做的就是从内存中0xa1000040读取kernel,跳过了64bytes的header,
					//并根据压缩类型进行解压缩,并把解压缩的image放在Load Address中即0xa0400000
					ret = bootm_load_os(images, 0);      -- common/bootm.c
						image_decomp() -- riscv qemu使用的是lz4,所以会使用lz4解压缩
							//load_buf=0xa0400000 image_buf=0xa1000040, 直接从0xa1000000读取,跳过uboot header,解压到load到地址
							ulz4fn(image_buf, image_len, load_buf, &size);  
								LZ4_decompress_generic()
					到这里uimage经过了去头,解压缩的动作,后面可以直接跳过去执行了
					
			5.1	if (!ret && (states & BOOTM_STATE_RAMDISK)) {
					//重定位ramdisk的位置- relocate init ramdisk
					ret = boot_ramdisk_high(&images->lmb, images->rd_start,rd_len, &images->initrd_start, &images->initrd_end);
	
			6.1	boot_fn = bootm_os_get_boot_func(images->os.os);
					通过os的类型,获取回调函数,linux的是 do_bootm_linux
					这个函数会根据arch来实现,每一个arch下面都有一个,riscv调用的在bootm.c	arch\riscv\lib
			
			7.1	ret = boot_fn(BOOTM_STATE_OS_PREP, argc, argv, images);
					//调用riscv的do_bootm_linux,根据falge 来执行准备工作,只是准备工作,不是boot
					//一般就是做boot前的检查
						if (flag & BOOTM_STATE_OS_PREP) {
							boot_prep_linux(images);
							return 0;
						}

			8.1	ret = boot_selected_os(argc, argv, BOOTM_STATE_OS_GO,images, boot_fn);
					//根据参数BOOTM_STATE_OS_GO,进行最后的boot工作,
					boot_fn(state, argc, argv, images);   ---去引导kernel了,不会返回了,除非是Stand-alone program
							boot_jump_linux(images, flag);
								kernel = (void (*)(ulong, void *))images->ep; 也就是最前面获取到entry地址0xa0400000
								kernel(gd->arch.boot_hart, images->ft_addr);   -- 启动kernel,后面就交给了kernel,传入的是machine id和dtb的地址
基于imx6ull的uboot2017启动流程 阅读详情

相关推荐

uboot源码分析——启动linux内核

如果板子启动以后不按任何键,将会默认启动Linux内核。 我们回到/common/main.c中,首先 s = getenv ("bootcmd"); 然后 run_command (s, 0); bootcmd是一个环境变量,它的值对应一些命令,用来启动linux "bootcmd=" CONFIG_BOOTCOMMAND "\0" /include/configs/mini244

Burning Water 1193

uboot命令之bootm详解

开发板:DM3730 cortex-a8 虚拟机:ubuntu 14.04 编译器:gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf 开发板内核:linux 4.4.12bootm 用于将内核镜像加载到内存的指定地址处,如果有需要还要解压镜像,然后根据操作系统和体系结构的不同给内核传递不同的启动参数,最后启动内核。 一、arm 架构处理器对 lin

小白要学arm 1万+

设备树学习(十二、uboot如何给内核传dtb文件)

在通过tag给内核传参时,是只需要知道内核的地址就可以了。 因为uboot给内核传的参数一般是放到内存的某个地址,因为tag所占的内存比较小,所以一般都时放在内存的起始地址+0x100的位置 之后直接使用,bootm + 内核所在内存的地址 bootm &lt;uImage_addr&gt; 在使用了设备树之后,一般我们是这样启动的 bootm &lt;uImage_addr&gt;...

To_run_away的博客 7735

Bootm启动流程分析

Bootm启动流程分析

m0_57705123的博客 4799

e-puck场景搭建

可以注意到一个黑色的小窗口出现在三维视图的左上角。它显示了电子吸盘机器人的摄像头拍摄的图像。该图像将保持黑色,直到机器人的控制器明确启用相机。最后,单击右上角的“x”可以关闭它。在对话框中,选择PROTO节点(Webots项目)/robots/gctronic/e-puck/e-puck(Robot)。一个电子吸盘机器人应该出现在竞技场的中央。通过按Alt+左键单击+拖动,对机器人施加力。无法对WoodenBox节点施加力,因为默认情况下,它们没有质量,并且被视为粘在地板上。将新控制器与机器人链接。

weixin_66540163的博客 767

告别玄学调参:手把手教你用LSTM-AutoEncoder为传感器数据做异常检测(实战篇)

本文详细介绍了LSTM-AutoEncoder在传感器数据异常检测中的工程化实践,包括数据预处理、模型架构设计和生产环境部署策略。通过结合LSTM的时间序列处理能力和AutoEncoder的特征提取优势,该方法能够有效识别温湿度、PM2.5等传感器数据的异常模式,适用于工业物联网和室内空气质量监测等场景。

weixin_29212429的博客 477

Uboot 多种方式 (booti、bootm、bootz、bootefi) 引导不同的内核镜像【全】

不管用那种方法,只要能将 Linux 内核镜像和设备树文件存到 DRAM 中就行,然后使用 Uboot 命令用于启动镜像文件。只要不修改 bootcmd 中的内容,以后每次开机 uboot 倒计时结束以后都会存储设备拷贝 内核 和 dtb文件,然后启动 Linux。bootz 命令类似 bootm 命令 (三个参数依次是kernel地址、initrd地址、dtb地址),举例通过网络工具。booti 命令类似 bootm 命令 (三个参数依次是kernel地址、initrd地址、dtb地址),举例从。

小鹅系列笔记 1万+

如何用SPSS做logistic回归

详细到只有作者本人能看懂的SPSS逻辑回归育儿经

qq_44794961的博客 2万+

uboot启动内核的相关命令详解——boot、bootm

1、boot和bootm命令的联系 当我们进入uboot的命令终端后,可以利用boot和bootm来启动内核,但是命令的使用方式有区别: 直接输入boot命令就可以启动内核,如果使用bootm命令,后面还需要传入内核在DDR中的地址。 (1)boot命令:完成内核的重定位,将内核从外存加载到内存,然后启动内核; (2)bootm命令:调用时一般要传入内核在内存中的地址,然后去该地址处启动内核;如果不传入内核在内存中的地址,bootm会用默认地址去启动内核,这样不保证能正确启动内核。 (3)bootm命令可

weixin_42031299的博客 1万+

Autojs实战教程---番茄免费小说Apk文件和源码

邀请码:782383363 字节跳到的App,推荐给大家,还是值得用一用的。不废话直接代码。 代码是带UI的复制后可以直接使用。 "ui"; //#region UI var rootUrl = "http://114.115.220.1:91";//各位大神小弟自己的服务器别黑谢谢 var storaySign = "FanqieXiaoShuo0412326@163.com"; var woolStorage = storages.create(storaySign);//创建本地存储 var

zy0412326的专栏 2万+

MuJoCo 相机图片怎么拿?视角调整获取物体图片及实时显示(附代码)

在Mujoco的仿真中,对于识别抓取场景来说,如何获得添加的body等物体的实时图像很重要,今天就分享下如何添加相机视角及可视化小方块(举例)的实时图片。复制一个scene.xml为scene_withcamera.xml,在xml中添加camera和小方块如下。设置xml文件中添加的相机body id。需要创建一个离屏渲染器。

darcsdn 2128

bootm跳转到kernel的流程

bootm跳转到kernel的流程 转自https://blog.youkuaiyun.com/ooonebook/article/details/53495021 一、bootm说明 bootm这个命令用于启动一个操作系统映像。它会从映像文件的头部取得一些信息,这些信息包括:映像文件的基于的cpu架构、其操作系统类型、映像的类型、压缩方式、映像文件在内存中的加载地址、映像文件运行的入口地址、映像文件名等。 紧接着bootm将映像加载到指定的地址,如果需要的话,还会解压映像并传递必要有参数给内核,最后...

wlf_go的博客 630

筹码峰五句口诀,看懂主力的秘密动作!(附实战图示)

筹码图的价值在于,它不像K线那样容易造假。主力可以骗线,但骗不了筹码分布。主力在不在;是吸筹还是出货;接下来是变盘还是震荡。这五句口诀可以说是“筹码阅读的入门圣经”:单峰坚挺变盘在即,双峰对垒高抛低吸;上峰不移主力在跑,多峰林立行情不止;下峰不移不离不弃,筹码识庄稳中取利!📌市场从来不是靠猜,而是靠看清。筹码,就是主力最真实的痕迹。如果你想学会提前布局、跟庄不被甩,学会看筹码峰——这一步必须打牢!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1164

uboot 2016 从 do_bootm 说起

http://www.cnblogs.com/awsqsh/articles/5558375.html below describes u-boot do_bootm flow: do_bootm   ->do_bootm_states     ->bootm_start /bootm_find_os /bootm_find_other       ->bootm

mkelehk的专栏 1287

【2026最新】3分钟Windows极速部署OpenClaw,完整可复制命令+全链路避坑指南

很多新手在Windows环境部署OpenClaw时,总会遇到各种玄学问题:WSL环境配置失败、Docker镜像拉取超时、容器启动后无法访问、权限报错、数据丢失……网上大量教程要么是Linux环境的,要么是早已过时的旧版本配置,照着操作不仅没法3分钟部署,反而要花几小时踩坑填坑。

2601_94871597的博客 493

UG二次开发GRIP创建drill工序

UG二次开发GRIP创建drill工序

qq285503851的博客 1696

uboot do_bootm函数详解

先来引用一下这篇介绍“ARM Linux内核启动要求”的文章ARM Linux Kernel Boot Requirements,是ARM Linux内核的维护者Russell King写的。 引用:     * CPU register settings           o r0 = 0.           o r1 = machine type number.

ccsu_ms的专栏 3542

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IMX6ULL-uboot启动内核流程分析(4)

uboot版本2016.03。

qq_42174306的博客 910

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

do_bootm_linux函数分析

(1) do_bootm_linux (cmdtp, flag, argc, argv, &images); ulong initrd_start, initrd_end; ulong ep = 0; bd_t *bd = gd->bd; char *s; #重新校验机器码 int machid = bd->bi_arch_number; #定义一个函数指针,用来重定位内核 void (*theKernel)(int zero, int arch, uint params); int r

weixin_44764479的博客 336

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

U-Boot启动引导内核分析

U-Boot启动引导内核分析(一) 分类: ARM Linux移植 2010-09-13 20:49 57人阅读 评论(0) 收藏 举报 标签:ARM   bootloader   U-Boot   代码分析 抵岸科技 U-Boot启动流程 大多数b

通往AGI之路 1007

u-boot 7、启动kernel

u-boot最终目的是启动内核,在u-boot命令中,通过bootcmd命令来实现kernel的启动。 以nand flash作为存储设备为例: bootcmd = nand read ${addr} kernel; bootm {addr}; nand read ${addr} kernel:是从nand flash的kernel分区读出kernel,并放到内存的addr中。 bootm

a421701136的专栏 460

u-boot-2016.5启动流程

开始从u-boot-2016.05\arch\arm\cpu\arm920t\start.S中reset执行 reset -> cpu_init_crit -> lowlevel_init -> _mainreset:...#ifndef CONFIG_SKIP_LOWLEVEL_INIT bl cpu_init_crit #endif bl _main...#ifndef C

Maxwell的博客 6055

u-boot学习笔记(三)

这是一篇u-boot2019的学习笔记,具体研究对象是黑芝麻bst A1000b,ARMv8架构,主要内容为u-boot启动流程分析(ARMv8)以及黑芝麻bstA1000b上的Linux启动流程。

2301_76355687的博客 962

U-Boot详解(三)之启动流程详解

再来看一下函数 rel_test 对于全局变量 rel_a 的调用,第 2 行设置 r3 的值为 pc+12 地址处的值,因为 ARM 流水线的原因,pc 寄存器的值为当前地址+8,因此 pc=0X87804184+8=0X8780418C,r3=0X8780418C+12=0X87804198,第 7 行就是0X87804198 这个地址,0X87804198 处的值为 0X8785DA50。但是,这个文件并不是最终使用的链接脚本,最终的链接脚本是在这个链接脚本的基础上生成的。,测试 DRAM,空函数。

ckg3824278的博客 225

uboot 启动流程分析(二) — 第二阶段

在 uboot 第一阶段启动完成后将会调用 start_armboot 开始第二阶段的启动流程,这个阶段的代码由 c 语言编写,分析如下: 一、基础数据结构 第二阶段主要用到了两个数据结构即 gd_t 和 bd_t,其定义如下: /* 全局数据结构 */ typedef struct global_data { bd_t *bd; /* 指向板级

嵌入式技术博客 1万+

嵌入式linux驱动之路17:U-Boot 启动流程(2)

嵌入式linux驱动之路17:U-Boot 启动流程(2)

fsfabc的博客 436
上一篇: U-boot 启动流程分析 5
下一篇: OpenSBI 简介-1
Runner_Linux
博客等级 码龄6年 17粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值