日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/1 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 uboot load address、entry point、 bootm address以及kernel运行地址的意义及联系 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

按各地址起作用的順序,uboot引導linux內核啟動涉及到以下地址:

  • load address:
  • entry point: 這兩個地址是mkimage時指定的
  • bootm address:bootm為uboot的一個命令,以此從address啟動kernel
  • 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

    總結

    以上是生活随笔為你收集整理的uboot load address、entry point、 bootm address以及kernel运行地址的意义及联系的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。