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

按各地址起作用的顺序,uboot引导linux内核启动涉及到以下地址:

  1. load address:
  2. entry point: 这两个地址是mkimage时指定的
  3. bootm address:bootm为uboot的一个命令,以此从address启动kernel
  4. kernel运行地址:在具体mach目录中的Makefile.boot中指定,为kernel启动后实际运行的物理地址
mkimage -n 'linux-3.2.1' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage uImage

理论上因为mkimage要为zImage加上0x40字节的header,所以entry point = load address + 0x40

但由于uboot 的bootm对uImage处理不是简单的go操作,其对前三个地址都有比较判断,所以在实际的操作中,就分为两种不同的情况:

1. bootm地址和load address一样

  此种情况下,bootm不会对uImage header后的zImage进行memory move的动作,而会直接go到entry point开始执行。因此此时的entry point必须设置为load address + 0x40。如果kernel boot过程没有到uncompressing the kernel,就可能是这里设置不对。

boom address == load address == entry point - 0x40

具体细节可参看uboot代码common/cmd_bootm.c中bootm_load_os函数的实现:

        switch (comp) {
case IH_COMP_NONE:
if (load == blob_start || load == image_start) {
printf(" XIP %s ... ", type_name);
no_overlap = 1;
} else {
printf(" Loading %s ... ", type_name);
memmove_wd((void *)load, (void *)image_start,
image_len, CHUNKSZ);
}
*load_end = load + image_len;
puts("OK\n");
break;

2. bootm地址和load address不一样(但需要避免出现memory move时出现覆盖导致zImage被破坏的情况)

  此种情况下,bootm会把uImage header后的zImage move到load address(见上方代码),然后go到entry point开始执行。 由此知道此时的load address必须等于entry point。

boom address != load address == entry point

因此,在mkimage以及设置uboot boot command的时候需要注意到以上两种情况。

 

至于kernel的运行地址,其与前3个地址没有关系,除了要避免内存覆盖导致解压后kernel不完整的情况。

zImage的头部有地址无关的自解压程序,因此刚开始执行的时候,zImage所在的内存地址(entry point)不需要同编译kernel的地址相同。自解压程序会把kernel解压到编译时指定的物理地址,然后开始地址相关代码的执行。在开启MMU之前,kernel都是直接使用物理地址(可参看System.map)。



转载于:https://www.cnblogs.com/sywtt/archive/2012/01/25/2329284.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java——集合(Map集合的两种迭代)

一,Map集合的第一种迭代 Map集合的第一种迭代,通过get(key)方法,根据键去获取值 package com.wsq.map;import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;public class Demo2_Iterator { …

如何使用两个堆栈实现队列_使用两个队列实现堆栈

如何使用两个堆栈实现队列Stack and Queue at a glance... 堆叠和排队一目了然... Stack: 堆栈: The stack is an ordered list where insertion and deletion are done from the same end, top. The last element that entered first is the first one to be del…

接口pk抽象类

作为开发者,谁从来没有陷入过周而复始地争论应该是使用接口还是抽象类?这是一场永无休止的争论,不同阵营的人总是坚定地坚持自己的立场。应当使用接口还是抽象类?对于初学者来说那更是满头雾水。这个问题应该考虑一下几个因素&…

汇编shr命令

右移命令 比如: mov eax,10 shr eax,0x2上面的命令是将eax的值右移两位,怎么左移呢?首先将eax的值转为二进制10------》1010,然后右移两位变成10,所以执行为shr命令,eax的值为十进制的2

iBatis入门和开发环境搭建

iBatis 的优缺点: 优点: 1、 减少代码量,简单; 2、 性能增强; 3、 Sql 语句与程序代码分离; 4、 增强了移植性; 缺点: 1、 和Hibernate 相比,sql 需要自己写&#x…

Python | 程序以字符串长度打印单词

Given a string and we have to split the string into words and also print the length of the each word in Python. 给定一个字符串,我们必须将字符串拆分为单词,并在Python中打印每个单词的长度。 Example: 例: Input:str "Hell…

Java——递归练习

#练习一:从键盘接收一个文件夹路径,统计该文件夹大小 ###分析: ####每句话相当与每一个要求,每一个要求用一个方法去实现 第一个方法 * getDir()* 第一个要求:从键盘接收一个文件夹路径* 1,创建键盘录入对…

C# 里怎样得到当前执行的函数名,当前代码行,源代码文件名。

得到函数名: System.Diagnostics.StackTrace st new System.Diagnostics.StackTrace(); this.Text st.GetFrame(0).ToString(); 得到代码行,源代码文件名: StackTrace st new StackTrace(new StackFrame(true)); Console…

PHP中单引号和双引号的区别

0x01 单引号 单引号里面的内容不会被解释&#xff0c;不管什么内容&#xff0c;都当做字符串处理 <?php$abc1234; $stradc$abc; echo $str;输出 0x02 双引号 双引号里面的内容会被解释&#xff0c;像一些换行&#xff08;\n)、数据元素等都会被解释 <?php$abc1234;…

Eclipse 代码提示无效的解决方法

代码提示一般有两种形势1、点提示无效经常打一个点就能调出该对象可选的方法列表。哪天不灵了&#xff0c;可以这样解决&#xff1a;window->Preferences->Java->Editor->Content Assist->Advanced 上面的选项卡Select the proposal kinds contained in the de…

getdate 日期间隔_日期getDate()方法以及JavaScript中的示例

getdate 日期间隔JavaScript Date getDate()方法 (JavaScript Date getDate() method) getDate() method is a Dates class method and it is used to get the current day of the month. getDate()方法是Date的类方法&#xff0c;用于获取当月的当前日期。 It accepts nothin…

关闭页面时执行“退出”的解决方案

在有些应用中我们需要实时的更新站点用户是否在线的状态。比如一些论坛里的在线成员实时显示&#xff0c;或基于网页的聊天、会议系统等。这种情况下&#xff0c;如果用户点击“退出”按钮或链接&#xff0c;我们将之行一系列后台操作&#xff0c;将该用户标识成off line状态&a…

Java——多线程实现的三种方式

创建新执行线程有三种方法。 第一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例。 例如&#xff0c;计算大于某一规定值的质数的线程可以写成&#xff1a; class PrimeThread extends Thread {long minPrime;Pri…

python网络编程---TCP客户端

0x01 环境 python2、 pycharm 0x02 程序 # -*- coding:UTF-8 -*- import sockettarget_hostwww.baidu.com tarfet_port80target_hostlocalhost target_port3345 dataABCDEF# 创建一个socket对象 client socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 连接客户端 clien…

c#枚举数字转枚举_C#枚举能力问题和解答 套装4

c#枚举数字转枚举1) What is the correct output of given code snippets in C#.NET? using System;class program{enum emp_salary : int{emp1 10000,emp2 15000,emp4 20000}static void Main(string[] args){int sal (int)emp_salary.emp2;Console.WriteLine(sal);}}100…

Java——匿名内部类实现线程的两种方式

package com.yy.thread;public class Demo4_Thread {public static void main(String[] args) {demo1(); //匿名内部类&#xff0c;第一种&#xff0c;继承Threaddemo2(); //匿名内部类&#xff0c;第二种&#xff0c;实现Runnable接口 }private static void…

zlib1.2.5的编译

zlib1.2.5没有了1.2.4的vc6工程&#xff0c;只好使用命令行编译。通过win32/Makefile.msc发现有4种编译方式&#xff0c;如下&#xff1a;# Usage:# nmake -f win32/Makefile.msc (standard build)# nmake -f win32/Makefile.msc LOC-DFOO …

python网络编程--UDP客户端

0x01 环境 python、pycharm 0x02 程序 # -*- coding:utf-8 -*-import sockettarget_host127.0.0.1 target_part80#创建一个socket对象 client socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#发送一些数据 client.sendto(AAAAAA,(target_host,target_part))#接收到的消息 …

window.open参数和技巧

【1、最基本的弹出窗口代码】 <SCRIPT LANGUAGE"javascript"> <!-- window.open (page.html) --> </SCRIPT> 因为着是一段javascripts代码&#xff0c;所以它们应该放在<SCRIPT LANGUAGE"javascript">标签和</script>之间。…

java jar包示例_Java包getImplementationTitle()方法和示例

java jar包示例包类的getImplementationTitle()方法 (Package Class getImplementationTitle() method) getImplementationTitle() method is available in java.lang package. getImplementationTitle()方法在java.lang包中可用。 getImplementationTitle() method is used to…