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.pswp.cn/news/379979.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379979.shtml
英文地址,請注明出處:http://en.pswp.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…