U-BOOT下使用bootm引导内核方法 bootm kernel 引导

U-boot引导流程分析二 Stage II过程分析 在Stage II中使用到了一些比较重要的数据结构,这里先对这些数据结构来进行下分析: typedef struct global_data { bd_t *bd; unsigned long flags; unsigned long baudrate; unsigned long have_console; /* serial_init() was cal 阅读详情

本文来自:

http://www.cnitblog.com/luofuchong/archive/2007/01/12/21834.html


u-boot 使用的是打上:
http://www.hhcn.com/cgi-bin/topic.cgi?forum=3&topic=651&show=0
上keety 大侠提供的补丁生成的u-boot-1.1.3


这段时间不断有人问我u-boot 启动内核的问题,记得在上次提供的u-boot 源码中提到了go 的方案,不过其实u-boot 本来有一种更好的方案: bootm
花了不少时间,查看了论坛上不少的帖子,认真阅读了bootm的源码,终于使用bootm把内核给跑起来了,
现把解决方法介绍如下:



一、在开始之前先说明一下bootm相关的东西。

1、 首先说明一下,S3C2410架构下的bootm只对sdram中的内核镜像文件进行操作(好像AT91架构提供了一段从flash复制内核镜像的代码, 不过针对s3c2410架构就没有这段代码,虽然可以在u-boot下添加这段代码,不过好像这个用处不大),所以请确保你的内核镜像下载到sdram 中,或者在bootcmd下把flash中的内核镜像复制到sdram中。

2、-a参数后是内核的运行地址,-e参数后是入口地址。

3、
1)如果我们没用mkimage对内核进行处理的话,那直接把内核下载到0x30008000再运行就行,内核会自解压运行(不过内核运行需要一个tag来传递参数,而这个tag建议是由bootloader提供的,在u-boot下默认是由bootm命令建立的)。
 
2)如果使用mkimage生成内核镜像文件的话,会在内核的前头加上了64byte的信息,供建立tag之用。bootm命令会首先判断bootm xxxx 这个指定的地址xxxx是否与-a指定的加载地址相同。
(1)如果不同的话会从这个地址开始提取出这个64byte的头部,对其进行分析,然后把去掉头部的内核复制到-a指定的load地址中去运行之
(2)如果相同的话那就让其原封不同的放在那,但-e指定的入口地址会推后64byte,以跳过这64byte的头部。


二、好,接着介绍使用mkimage生成镜像文件并下载运行的方法。

方法一、
1、首先,用u-boot/tools/mkimage 这个工具为你的内核加上u-boot 引导所需要的文件头,具体做法如下:
[root@localhost tftpboot]#mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage zImage.img
Image Name:   linux-2.6.14
Created:      Fri Jan 12 17:14:50 2007
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    1262504 Bytes = 1232.91 kB = 1.20 MB
Load Address: 0x30008000
Entry Point:  0x30008000

这里解释一下参数的意义:
        -A ==> set architecture to 'arch'
        -O ==> set operating system to 'os'
        -T ==> set image type to 'type'
        -C ==> set compression type 'comp'
        -a ==> set load address to 'addr' (hex)
        -e ==> set entry point to 'ep' (hex)
        -n ==> set image name to 'name'
        -d ==> use image data from 'datafile'
        -x ==> set XIP (execute in place)
 

2 、下载内核
U-Boot 1.1.3 (Jan 12 2007 - 16:16:36)

U-Boot code: 33F80000 -> 33F9BAC0  BSS: -> 33F9FBAC
RAM Configuration:
Bank #0: 30000000 64 MB
Nor Flash: 512 kB
Nand Flash:  64 MB
In:    serial
Out:   serial
Err:   serial
Hit any key to stop autoboot:  0
sbc2410=>tftp 0x31000000 zImage.img        
TFTP from server 192.168.1.115; our IP address is 192.168.1.128
Filename 'zImage.img'.
Load address: 0x31000000
Loading: #################################################################
        #################################################################
        #################################################################
        ####################################################
done
Bytes transferred = 1263324 (1346dc hex)

3.运行 

sbc2410=>bootm 0x31000000
## Booting image at 31000000 ...
  Image Name:   linun-2.6.14 
  Image Type:   ARM Linux Kernel Image (uncompressed)
  Data Size:    1263260 Bytes =  1.2 MB
  Load Address: 30008000
  Entry Point:  30008000
  Verifying Checksum ... OK
OK

Starting kernel ...

Uncompressing Linux.............................................................Linux version 2.6.14 (root@luofuchong) (gcc version 3.4.1) #21 Fri Oct 20 17:206CPU: ARM920Tid(wb) [41129200] revision 0 (ARMv4T)
Machine: SMDK2410
Memory policy: ECC disabled, Data cache writeback
CPU S3C2410A (id 0x32410002)


方法二、
1、首先,用u-boot/tools/mkimage 这个工具为你的内核加上u-boot 引导所需要的文件头,具体做法如下:
[root@localhost tftpboot]#mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage zImage.img
Image Name:   linux-2.6.14
Created:      Fri Jan 12 17:14:50 2007
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    1262504 Bytes = 1232.91 kB = 1.20 MB
Load Address: 0x30008000
Entry Point:  0x30008040
 

2 、下载内核
U-Boot 1.1.3 (Jan 12 2007 - 16:16:36)

U-Boot code: 33F80000 -> 33F9BAC0  BSS: -> 33F9FBAC
RAM Configuration:
Bank #0: 30000000 64 MB
Nor Flash: 512 kB
Nand Flash:  64 MB
In:    serial
Out:   serial
Err:   serial
Hit any key to stop autoboot:  0
sbc2410=>tftp 0x30008000 zImage.img        
TFTP from server 192.168.1.115; our IP address is 192.168.1.128
Filename 'zImage.img'.
Load address: 0x30008000
Loading: #################################################################
        #################################################################
        #################################################################
        ####################################################
done
Bytes transferred = 1263324 (1346dc hex)


3.运行 

sbc2410=>bootm 0x30008000
## Booting image at 30008000 ...
   Image Name:   linux-2.6.14
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    1261056 Bytes =  1.2 MB
   Load Address: 30008000
   Entry Point:  30008040
   Verifying Checksum ... OK
   XIP Kernel Image ... OK


内核启动信息省。。。。


三、固化
       
如果你想把镜像文件写入flash,每次开机后让u-boot帮你复制到sdram中,再使用bootm命令引导的话,可以按照这样操作:
sbc2410=>tftp 0x30008000 zImage.img
TFTP from server 192.168.1.115; our IP address is 192.168.1.128
Filename 'zImage.img'.
Load address: 0x30008000
Loading: #################################################################
        #################################################################
        #################################################################
        ####################################################
done
Bytes transferred = 1263324 (1346dc hex)
sbc2410=>nand erase 0x30000 0x1d0000

NAND erase: device 0 offset 196608, size 1900544 ... OK
sbc2410=>nand write 0x30008000 0x30000 0x1d0000

NAND write: device 0 offset 196608, size 1900544 ...  1900544 bytes written: OK

设置u-boot启动命令:
1、针对方法一:
sbc2410=>setenv bootcmd nand read 0x31000000 0x30000 0x1d0000/;bootm 0x31000000
sbc2410=>saveenv
Saving Environment to NAND...
Erasing Nand...Writing to Nand... done
2、针对方法二:
sbc2410=>setenv bootcmd nand read 0x30008000 0x30000 0x1d0000/;bootm 0x30008000
sbc2410=>saveenv
Saving Environment to NAND...
Erasing Nand...Writing to Nand... done

sbc2410=>reset
启动信息略。。。。

U-Boot引导命令辨析:booti、bootm、bootz的终极指南 本文深入解析U-Boot引导命令booti、bootm和bootz的适用场景与使用策略,重点针对ARM64架构和Linux kernel的启动优化。通过对比分析各命令的底层机制、设备树处理及内存布局要求,提供实战指南帮助开发者在嵌入式系统中正确选择和使用引导命令,确保系统稳定启动。 阅读详情

相关推荐

U-BOOT下使用bootm引导内核方法

U-BOOT下使用bootm引导内核方法

【linux kernel】以tftp方式启动linux内核

在嵌入式linux开发中,我们一般是在自己的个人电脑或者服务器上进行linux相关的编译构建,在编译构建完成后,生成的系统镜像、系统组件等文件需要烧写到具体的目标机子上。然而,在实际调试开发过程中,如果每修改一次系统镜像和组件就向目标机子烧写一次,这将是一件繁杂且低效率的事情,这时候,我们则可以在开发电脑和目标平台之间搭建tftp服务环境。这么做,我们可以很方便的通过tftp下载开发主机上的文件到目标平台上。

iriczhao的博客 2444

从光耦隔离到稳定驱动:信捷伺服与STM32的硬件设计陷阱与救赎

本文深入探讨了信捷伺服驱动器与STM32微控制器配合时的硬件设计关键问题,包括光耦隔离电路选型、电源电压选择、拨码开关设置等核心环节。针对伺服驱动器的稳定驱动需求,提供了从电路设计到抗干扰策略的完整解决方案,帮助工程师规避常见陷阱,提升工业控制系统的可靠性。

gold8的专栏 310

Bootm启动流程分析

Bootm启动流程分析

m0_57705123的博客 4799

VisionMaster字符检测避坑指南:为什么你的缺陷检测总误判?7个参数陷阱详解

本文深入剖析了海康VisionMaster在字符缺陷检测中导致误判的7个关键参数陷阱,包括二值化参数、最小字符面积与宽度、字符极性及缺陷判决参数等。通过药品喷码和PCB丝印等实战案例,提供了系统的调试心法与工作流,帮助工程师精准调参,有效降低误判率,提升检测稳定性。

rust6ferris的博客 1097

工业以太网通讯Profinet协议详解

Profinet是通过西门子控制系统被广泛使用的工业通信协议,是一种较新的,基于以太网的工业通讯协议。

mydatai的专栏 8851

U-boot启动内核之二bootm启动内核

整理自[uboot] uboot启动kernel篇(二)——bootm跳转到kernel的流程](bootm根据参数指向的镜像填充此结构体,然后使用结构体的内容填充kernel的启动信息,进行跳转。do_bootm_states根据states来判断要执行的操作。

yiyu20180729的博客 1163

电压抬升电路设计

一、实验目的 掌握集成运放电压放大电路设计基本方法。 掌握基本仪器使用方法(电源、信号发生器、示波器)。 二、实验内容及结果 实验内容 基于集成运放设计一传感器信号采集电路。传感器输出信号在±50mV,频率为100Hz以内,模数转换器允许输入电压在0~5V,要求设计传感器与模数转换器之间的信号采集电路,实现传感器信号放大10倍,并适合模数转换器的输入。模数转换器的输入电阻为1KHz,设计电路时,可使用1KHz电阻作为信号采集电路负载,代替模数转换器。 实验具体要求如下: (1)确定电路形式,说明电压转

Safaearth的博客 4万+

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万+

Docker新手必看:解决‘Unable to find image’错误的完整指南

本文针对Docker新手常见的‘Unable to find image’错误,提供了完整的排查与解决指南。文章深入剖析了权限不足、网络连接失败、Docker服务未运行等核心原因,并给出了将用户加入docker组、配置镜像加速器等实用解决方案,帮助读者彻底理解并解决镜像拉取问题。

weixin_29230901的博客 241

基于Simulink的PMSM轮毂电机崎岖路面悬架协同控制仿真

本文完成了基于Simulink的PMSM轮毂电机崎岖路面悬架协同控制仿真,实现了:✅ 构建了四轮独立驱动+主动悬架高保真整车模型✅ 实现了Skyhook主动悬架控制✅ 设计了驱动-悬架状态共享与协同决策机制✅ 验证了5 m/s高速下连续颠簸路面稳定通过能力✅ 为高性能移动机器人提供一体化底盘解决方案。

xiaoheshang_123的博客 190

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

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

weixin_42031299的博客 1万+

银行一表通监管报送系统详解

国家金融监管总局对于“一表通”的总体描述为:通过建立一套明细级、标准化的数据体系和汇总计算规则,将银行机构传送至监管可信区的业务明细数据汇总生成财务指标、监管指标和监管报表,大幅提升监管数据时效性,统一数据标准,实现数据间的穿透和整合,同时改变机构多头报送数据模式,减轻机构报送负担。

银行信息系统应用架构详解 2516

u-boot 引导linux 内核过程

u-boot 引导linux 内核过程

一叶知秋的博客 1186

基于ESP32和OV5640的目标检测系统

本文详细介绍了基于ESP32-S3和OV5640摄像头构建目标检测系统的完整方案。系统采用YOLOv8-Nano轻量级模型,通过INT8量化实现边缘部署,在UXGA分辨率下达到25fps帧率。文章从硬件选型、图像采集优化、模型量化部署、实时推理流水线构建等维度展开,重点解决了内存管理、电源稳定性和异常处理等嵌入式系统关键问题。该方案在资源受限条件下实现了150ms以内的端到端延迟,为物联网视觉应用提供了低成本、低功耗的解决方案,适用于智能家居、工业检测等多个场景。

reset2021的博客 329

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

bootm命令中地址参数,内核加载地址以及内核入口地址

bootm命令只能用来引导经过mkimage构建了镜像头的内核镜像文件以及根文件镜像,对于没有用mkimage对内核进行处理的话,那直接把内核下载到连接脚本中指定的加载地址0x30008000再运行就行,内核会自解压运行(不过内核运行需要一个tag来传递参数,而这个tag是由bootloader提供的,在u-boot下默认是由bootm命令建立的)。 通过mkimage可以给内核镜像或根文件系统镜像加入一个用来记录镜像的各种信息的头。同样通过mkimage也可以将内核镜像进行一次压缩(指定-C none/g

I15902020106的博客 1612

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

U-Boot引导命令的演进:从bootm到booti的技术变迁

本文探讨了U-Boot引导命令从bootm到booti的技术演进,重点分析了ARM64架构和Linux kernel的标准化Image格式如何推动这一变迁。booti命令专为现代嵌入式系统设计,简化了启动流程,提高了可靠性,并深度整合设备树(Device Tree)支持,为开发者提供了更高效的引导解决方案。

uran的专栏 719

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

load address、entry point、 bootm address以及kernel运行地址

load address:加载地址 load_addr mkimage -a entry point: 入口地址 entry_point mkimage -e bootm address:bootm 命令后面紧跟的地址,也就是加载地址 addr kernel运行地址:zImage自解压后将kernel解压到实际运行的物理地址 所谓加载地址...

anwu0979的博客 1277

对《U-BOOT下使用bootm引导内核方法》的补充说明

对《U-BOOT下使用bootm引导内核方法》的补充说明   转自:http://zhoufeng8301.blog.163.com/blog/static/5545770520090554720813/ lufuchong对bootm引导内核做了详细的说明,原文见: http://www.cnitblog.com/luofuchong/archive/2007/01

GQB的专栏 1561

u-BOOT启动流程

u-boot启动流程 打开lds文件可以看到代码当前入口点: :_start,_start后面就是中断向量表,通过查看map地址可以得知start地址为 0Xc0100000,即整个 uboot的起始地址就是 0Xc0100000 2、u-boot启动过程中主要用到的一些函数:board_init_f:初始化一系列外设,比如串口、定时器,或者打印一些消息等。 relocate_code:用于代

weixin_42542969的博客 1345

U-Boot 学习

lmb所记录的内存信息最终会传递给kernel。在/include/lmb.h和/lib/lmb.c中有对lmb的接口和定义的具体描述。linux kernel从stext开始启动,整个流程大概就是读取X0(FDT地址)保存到X21中,又将X21保存到__fdt_pointer全局变量中,然后再将__fdt_pointer解析处cmdline数据到boot_command_line全局变量中。在kernel镜像的基础上,加上64Byte的信息提供给uboot使用,定义在include/image.h中。

chen_xing_hai的博客 2106

uboot load address、entry point、 bootm address以及kernel运行地址的意义及联系

uboot load address、entry point、 bootm address以及kernel运行地址的意义及联系

开阳-英飞凌-小华 1132

记录u-boot不能引导内核的解决过程

记录u-boot不能引导内核的解决过程

hfyutdg的博客 491

bootm引导内核过程详解之一-cmd_bootm

//文件名:u-boot-1.3.1/common/cmd_bootm.c//bootm引导内核过程详解之一-cmd_bootm//Thomas.Yang 2010.05.25 /*do_bootm()是bootm命令真正执行的第一个函数主要功能 :1. 复制Image(这里指的是uImage) 头到全局变量header;2. 检查header的magic numb

Thomas Yang 的专栏 6508

u-boot移值(七)-启动到引导Kernel流程梳理

    结合前六篇文章,总结下u-boot在i.mx28x上的引导流程,以下序号根据程序执行顺序排序: (0)一般程序是放到flash中的,Flash分为Nor Flash和Nand Flash两种,如果是Nor Flash,CPU上电后,Nor flash就相当于内存一样,CPU可以直接访问,并且可以直接在Nor flash上运行。而如果是Nand Flash,ARM内核里有一个4kb的 SR...

猪哥的专栏 1144
上一篇: ARM ADS中的AXD 调试经验集锦
下一篇: 安装gdb6.8 insight6.8 gdb insight
#Page#
博客等级 码龄23年 1691粉丝 360原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值