U-Boot直接引导zImage内核

U-boot引导内核流程分析 当U-boot完成重定位和初始化外设后,它将正式进入工作状态,可以加载内核镜像到DDR的链接地址中了 阅读详情

 

         U-boot1.1.6只能只能就能过mkimage工具加工后的内核镜像文件。mkimage工具给zImage增加了一个64B大小的头。U-Boot是通过bootm命令来引导Linux内核的,bootm命令调用do_bootm函数来mkimage工具增加的头,最后调用do_bootm_linux函数引导去掉了mkimage工具增加的头的Linux内核,也就是zImage,启动的流程可以参考图解U-Boot:引导内核分析这篇博客。

     要让U-Boot直接引导zImage内核,只需在do_bootm函数中去掉对mkimage工具增加的头的分析,直接调用do_bootm_linux函数引导zImage内核即可。下面是经过修改的do_bootm函数,修改的部分用///////////包围起来了,省略号后面的就不需要改动了。这个函数common/cmd_bootm.c文件中。

  1. int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) 
  2. { 
  3.     ulong   iflag; 
  4.     ulong   addr; 
  5.     ulong   data, len, checksum; 
  6.     ulong  *len_ptr; 
  7.     uint    unc_len = CFG_BOOTM_LEN; 
  8.     int i, verify; 
  9.     char    *name, *s; 
  10.     int (*appl)(int, char *[]); 
  11.     image_header_t *hdr = &header; 
  12.     s = getenv ("verify"); 
  13.     verify = (s && (*s == 'n')) ? 0 : 1; 
  14.     if (argc < 2) { 
  15.         addr = load_addr; 
  16.     } else { 
  17.         addr = simple_strtoul(argv[1], NULL, 16); 
  18.     } 
  19.     SHOW_BOOT_PROGRESS (1); 
  20. ////////////////////////////////////////////////////////////////////////////////// 
  21.     //printf ("## Booting image at %08lx ...\n", addr); 
  22.     printf ("## Booting from zImage at %08lx ---by ce123\n", addr); 
  23. #ifdef CONFIG_SILENT_CONSOLE 
  24.         fixup_silent_linux(); 
  25. #endif 
  26.         do_bootm_linux  (cmdtp, flag, argc, argv, 
  27.                  addr, len_ptr, verify); 
  28. ////////////////////////////////////////////////////////////////////////////////// 
  29. ...... 
int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
	ulong	iflag;
	ulong	addr;
	ulong	data, len, checksum;
	ulong  *len_ptr;
	uint	unc_len = CFG_BOOTM_LEN;
	int	i, verify;
	char	*name, *s;
	int	(*appl)(int, char *[]);
	image_header_t *hdr = &header;
 	s = getenv ("verify");
	verify = (s && (*s == 'n')) ? 0 : 1;
 	if (argc < 2) {
		addr = load_addr;
	} else {
		addr = simple_strtoul(argv[1], NULL, 16);
	}
 	SHOW_BOOT_PROGRESS (1);
//////////////////////////////////////////////////////////////////////////////////
	//printf ("## Booting image at %08lx ...\n", addr);
	printf ("## Booting from zImage at %08lx ---by ce123\n", addr);
#ifdef CONFIG_SILENT_CONSOLE
	    fixup_silent_linux();
#endif
	    do_bootm_linux  (cmdtp, flag, argc, argv,
			     addr, len_ptr, verify);
//////////////////////////////////////////////////////////////////////////////////
......

接下来还要修改一下lib_arm/armlinux.c中的do_bootm_linux函数。这里主要是修改kernal的加载地址(theKernel = (void (*)(int, int, uint))addr)。这就要求我们将zImage内核下载内存的addr处。并且用bootm addr进行引导,默认的地址是0x30008000,如果直接使用bootm进行引导,则需要将内核下载到0x30008000,否则无法引导内核。

  1. void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], 
  2.              ulong addr, ulong *len_ptr, int verify) 
  3. { 
  4.     ulong len = 0, checksum; 
  5.     ulong initrd_start, initrd_end; 
  6.     ulong data; 
  7.     void (*theKernel)(int zero, int arch, uint params); 
  8.     image_header_t *hdr = &header; 
  9.     bd_t *bd = gd->bd; 
  10.  
  11.  
  12. #ifdef CONFIG_CMDLINE_TAG 
  13.     char *commandline = getenv ("bootargs"); 
  14. #endif 
  15.  
  16.  
  17.     //theKernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep); 
  18.     theKernel = (void (*)(int, int, uint))addr; 
void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
		     ulong addr, ulong *len_ptr, int verify)
{
	ulong len = 0, checksum;
	ulong initrd_start, initrd_end;
	ulong data;
	void (*theKernel)(int zero, int arch, uint params);
	image_header_t *hdr = &header;
	bd_t *bd = gd->bd;


#ifdef CONFIG_CMDLINE_TAG
	char *commandline = getenv ("bootargs");
#endif


	//theKernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep);
	theKernel = (void (*)(int, int, uint))addr;

下面是引导信息:

U-Boot 1.1.6 (Mar 11 2012 - 14:06:15)


DRAM:  64 MB
Flash:  2 MB
NAND:  256 MiB
In:    serial
Out:   serial
Err:   serial
Hit any key to stop autoboot:  0

NAND read: device 0 offset 0x240000, size 0x200000
2097152 bytes read: OK
## Booting from zImage at 30008000 ---by ce123

Starting kernel ...

Uncompressing Linux.............................................................
............................................................. done, booting the
kernel.

linux内核相关镜像zImage、zImage、bzImage、vmlinuz、vmlinux、Image关系分析(摘自《国嵌-嵌入式Linux内核驱动进阶班实验手册》) 阅读详情

相关推荐

uImage和zImage的区别

1. 各种文件的意义 vmlinux 编译出来的最原始的内核文件,未压缩。 zImage 是vmlinux经过gzip压缩后的文件。 bzImage bz表示“big zImage”,不是用bzip2压缩的。两者的不同之处在于,zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么采用zImage或bzImage都行,如果比较大应该用bzImage。 uImage U-boot专用的映像文件,它是在zImage之前加上一个长度为0x

XFH1207的博客 2561

linux的uboot和内核区别,linux的uboot启动映像、zImage和uImage的区别

因为都是从各网站上搜集过来的资料,如果有涉权请告知.............uboot启动zImage(go)和uImage(bootm)分析1.bootm加载linux镜像是加载uIamge,uIamge是由mkimage制作而来,和zIamge的差异是uIamge是zIamge压缩过的,bootm需要先对uIamge解压,解压地址为内核入口地址。当解压完成时uIamge和zIamge几乎是相同...

weixin_30290131的博客 1029

优化NEXYS A7开发板(Xilinx Artix-7)Microblaze核的FLASH读写性能实战

本文针对NEXYS A7开发板(Xilinx Artix-7)上Microblaze核读写FLASH速度慢的问题,提供了系统性的优化实战指南。通过深入分析SPI控制器配置、Flash指令模式选择、Microblaze核的Cache与硬件加速器优化,以及程序运行位置(BRAM vs DDR)的调整,有效将FLASH读写性能从“龟速”提升至接近理论峰值。文章结合实测数据,为FPGA嵌入式开发者提供了清晰的性能瓶颈分析与解决方案。

carrot的博客 256

uImage与zImage的区别(转载)

内核编译(make)之后会生成两个文件,一个Image,一个zImage,其中Image为内核映像文件,而zImage为内核的一种映像压缩文件,Image大约为4M,而zImage不到2M。    那么uImage又是什么的?它是uboot专用的映像文件,它是在zImage之前加上一个长度为64字节的“头”,说明这个内核的版本、加载位置、生成时间、大小等信息;其0x40之后与zImage没

ctwei85的专栏 2617

基于STM32控制直流电机加减速正反转仿真设计

*单片机设计介绍,基于STM32控制直流电机加减速正反转仿真设计。

2201_75940997的博客 1603

grafana使用方法

1、点击仪表盘2、新建仪表盘3、选择数据源4、选择查询的条件5、美化。

2403_87359664的博客 323

uboot直接启动 zImage

int do_bootz (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { ulong addr; int i; void (*theKernel)(int zero, int arch, uint params); bd_t *bd = gd->bd; addr = 0x30008000; printf ("## Boo

Etual的专栏 6770

hpm6750evk2开发板(一)菜鸟入门

hpm6750与我们平时常用的stm单片机在开发环境和开发方法上有很大的区别,所以上手还是需要花一点时间的,拿到板子先不要急着上电调试,我们先找资料学习一下了,免得多走冤枉路,以下是我整理的一些学习资源,包括开发板使用手册、芯片SDK、开发工具、视频资料等,建议先把使用手册和学习视频先看了,再取搭建环境测试。最近刚入手一块hpm6750evk2开发板,花了几天时间学习,算是菜鸟入门了,今天分享一下学习过程。看完资料后,把开发工具安装上,下一篇文章我们分享一下调试工程的过程和遇到的问题。

Silas1750的博客 3083

uboot启动zImage(go)和uImage(bootm)分析

http://www.linuxforum.net/forum/showthreaded.php?Cat=&Board=embedded&Number=700811&Search=true&Forum=embedded&Words=uboot%C6%F4%B6%AFzImage&Match=Entire%20Phrase&Searchpage=0&Limit=25&Old=allposts&Mai

xxblinux的专栏 1512

OpenClaw 子代理配对失败问题分析与解决方案

OpenClaw子代理配对失败问题分析与解决方案 问题核心在于agent设备权限不足,仅有operator.approvals权限而缺少operator.admin权限,导致子代理启动时形成权限死锁。本文提供三种解决方案: 直接编辑设备配对文件(推荐):修改本地JSON文件,为agent设备添加完整operator.admin权限,操作简单快捷。 标准重新配对流程:删除现有agent设备后重新配对,通过正常审批流程获取完整权限,符合系统安全设计。 修改源码降低权限要求(仅限开发环境):调整子代理代码避免强制

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 148

从零开始学 AUTOSAR:深入浅出 SAE J1939 诊断通信管理器(J1939Dcm)深度完整版

SAE J1939 是美国汽车工程师学会制定的重型车辆 CAN 总线通信标准,覆盖卡车、客车、工程机械、农机、船舶等,是商用车领域的 “通用语言”。基于CAN 2.0B 扩展帧(29 位 ID)(车规主流)PGN(参数组号)+ SPN(可疑参数号)核心标准:J1939-21:数据链路层(CAN 帧格式、地址声明)J1939-71:应用层(普通信号、报文)诊断层(核心!J1939Dcm 依据)J1939-81:网络管理(地址管理、节点检测)

getusushu的博客 112

u-boot中mkimage工具的具体使用

通常,u-boot为kernel提供一些kernel无法知道的信息,比如ramdisk在RAM中的地址。Kernel也必须为U-boot提供必要的信息,如通过mkimage这个工具(在u-boot代码的tools目录中)可以给zImage添加一个header,也就是使得通常编译的内核zImage添加一个数据头,把添加头后的image通常叫uImage,uImage是可以被U-boot直接引导的内核镜像。那么如何使用mkimage工具而产生uImage的呢?下面将具体介绍mkimage工具的使用:1.首先查看

392

初识 QML

QML 是一种声明性语言,允许根据用户界面的可视组件以及它们如何相互交互和相互关联来描述用户界面。QML 是一种高度可读的语言,旨在使组件能够以动态方式互连,并且允许组件在用户界面中轻松重复使用和自定义。 使用 Qt Quick,开发人员可以轻松地在 QML 中构建流体动画用户界面,并且可以选择将这些用户界面连接到任何后端 C++ 库。

青春不老,奋斗不止! 1万+

如何将 zImage 转换为 uImage 以使用 u-boot 启动 Linux 内核

本文将介绍如何将zImage转换为uImage

ys_kiyano的博客 1431

AD9361功能介绍和使用

AD9361使用分数分频锁相环(PLL)来产生发射机和接收机本地振荡器(LO)频率和BB PLL。BB PLL 可用于数据转换、数字滤波器和 |/O 端口。PLL的参考时钟可以由外部振荡器或外部晶体(XO)和数字可编程片内可变电容提供,电容微调产生参考时钟频率,XO和微调电容的组合统称为DCXO。有多个天线输入的分集系统。接收链数据首先经过低噪声放大器(LNA),然后是同相(1)和正交(Q)放大器,混频器和频带整形滤波器,可将接收到的信号下变频为基带以进行数字化。时分双工(TDD)和频分双工(FDD)。。。

wangjie36的博客 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

uboot引导linux内核过程 卡死Starting kernel ...(下载地址,加载地址,入口地址的修改)(uImage和zImage的区别)

red\color{#FF3030}{red}red 小龙

shenlong1356的博客 2395

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

u-boot引导zImage内核

u-boot-1.1.6 因为/common/cmd_bootm.c支持的是启动uZimage,而我使用的是zImage,所以决定该写一个可以支持zImage的命令。 u-boot启动过程三步: 1.拷贝内核到SDRAM指定地址(0x30008000) 2.设置传递给linux的参数(0x30000100) 3.跳转到linux内核首地址

红娃子 2358

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

u-boot下使用bootm引导内核心得 

 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花了不少时间,查看了论坛上的

wenlifu71022的专栏 1667
上一篇: 多进程实现linux 下即时聊天软件
下一篇: ubuntu12.04嵌入式开发环境搭建
zhouxf_cn
博客等级 码龄14年 54粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值