04.uboot分析uboot啟動內(nèi)核

      網(wǎng)友投稿 942 2022-05-29

      首先要明確:uboot目標是從flash讀出內(nèi)核(nand read.jffs2 0x30007FC0 kernel;),啟動它(bootm 0x30007FC0)。

      /*從NAND讀出內(nèi)核:從哪里讀,從kernel分區(qū)讀 放到哪里去:0x30007FC0(可以隨便放) nand read.jffs2 0x30007FC0 0x00060000 0x00200000*/ nand read.jffs2 0x30007FC0 kernel; /*flash上存放的內(nèi)核為uimage,uimage為頭部+真正的內(nèi)核*/ bootm 0x30007FC0 /*image_header 如下*/ typedef struct image_header { uint32_t ih_magic; /* Image Header Magic Number */ uint32_t ih_hcrc; /* Image Header CRC Checksum */ uint32_t ih_time; /* Image Creation Timestamp */ uint32_t ih_size; /* Image Data Size */ /*bootm先讀出頭部,知道加載地址和入口地址。當真正的內(nèi)核不位于加載地址時,會自動把內(nèi)核放到加載地址,然后跳轉到入口地址執(zhí)行。*/ /*所以可以隨便放內(nèi)核到某個地址。我們開發(fā)板的加載地址0x30008000 */*/ uint32_t ih_load; /* Data Load Address加載地址 */ uint32_t ih_ep; /* Entry Point Address入口地址 */ uint32_t ih_dcrc; /* Image Data CRC Checksum */ uint8_t ih_os; /* Operating System */ uint8_t ih_arch; /* CPU architecture */ uint8_t ih_type; /* Image Type */ uint8_t ih_comp; /* Compression Type */ uint8_t ih_name[IH_NMLEN]; /* Image Name */ } image_header_t; /* Copy header so we can blank CRC field for re-calculation 讀出頭部*/ memmove (&header, (char *)addr, sizeof(image_header_t)); /**/ /* !(CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG) data為真正內(nèi)核,移動到ih_load地址 */ memmove ((void *) ntohl(hdr->ih_load), (uchar *)data, len); /*另外一種情況,不需要移動內(nèi)核,內(nèi)核剛好位于ih_load地址*/ /*為什么是0x30007FC0地址?0x30008000-0x30007FC0=64字節(jié)。頭部剛好為64字節(jié)。 0x30007FC0+64字節(jié)剛好為加載地址0x30008000。不需要再次移動*/ if(ntohl(hdr->ih_load) == data) { printf (" XIP %s ... ", name); } /*綜上,bootm做的事情:1.移動內(nèi)核到合適的地方(加載地址);2.啟動。(do_bootm_linux)*/ /*內(nèi)核也位于加載地址了,是不是就可以在入口地址啟動內(nèi)核了?不是!PC機啟動時BIOS會檢測內(nèi)存,flash告訴內(nèi)核*/ /*同樣uboot也要告訴內(nèi)核一些啟動參數(shù);之后才會跳到入口地址啟動內(nèi)核*/ theKernel = (void (*)(int, int, uint))addr; /*hdr->ih_ep頭部入口地址*/ theKernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep); /*啟動內(nèi)核*/ theKernel (0, bd->bi_arch_number, bd->bi_boot_params); /*啟動內(nèi)核:1.設置參數(shù)2.跳轉到入口地址去*/ /*如何設置參數(shù)*/ /*uboot把內(nèi)核讀進來之后就啟動他然后跳轉到內(nèi)核去,uboot就不存在了。uboot和內(nèi)核之間如何交互數(shù)據(jù)。*/ /*在某個地址(和內(nèi)核約定好的,開發(fā)板0x30000100)按某種格式(TAG)保存數(shù)據(jù),內(nèi)核啟動后再去讀出來。*/ setup_start_tag (bd); setup_memory_tags (bd); setup_commandline_tag (bd, commandline); setup_end_tag (bd); static void setup_start_tag (bd_t *bd) { params = (struct tag *) bd->bi_boot_params; params->hdr.tag = ATAG_CORE; params->hdr.size = tag_size (tag_core); params->u.core.flags = 0; params->u.core.pagesize = 0; params->u.core.rootdev = 0; params = tag_next (params); struct tag { struct tag_header hdr; union { struct tag_core core; struct tag_mem_range mem_range; struct tag_cmdline cmdline; struct tag_clock clock; struct tag_ethernet ethernet; } u; }; }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      53

      54

      55

      56

      57

      58

      59

      60

      61

      62

      63

      64

      65

      66

      67

      68

      04.uboot分析之uboot啟動內(nèi)核

      69

      70

      71

      72

      73

      74

      75

      76

      77

      78

      79

      80

      81

      分區(qū)概念:

      PC機可以給硬盤分區(qū),但是嵌入式linux的flash沒有分區(qū)表。所以我們只能在代碼寫死bootloader分區(qū),kernel分區(qū),root分區(qū)等。所謂的ubbot的分區(qū),我們關心地址。在100ask24x0.h中已經(jīng)寫死,如下:

      /*分區(qū)位于nandflash0上,從0到256k為bootloader;接下來的128k為存放環(huán)境變量的params;接下來2m為kernel;剩下的為root。起始地址和大小很重要!*/ #define MTDPARTS_DEFAULT "mtdparts=nandflash0:256k@0(bootloader)," \ "128k(params)," \ "2m(kernel)," \ "-(root)"

      1

      2

      3

      4

      5

      ARM

      版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。

      上一篇:基于鯤鵬應用使能套件進行MySQL性能調(diào)優(yōu)|【我的華為云體驗之旅】
      下一篇:極簡Vue基礎指令與方法
      相關文章
      亚洲五月丁香综合视频| 亚洲欧洲日韩综合| 亚洲AV无码一区二区三区久久精品| 亚洲伊人久久大香线蕉| 亚洲国产品综合人成综合网站| 久久综合九九亚洲一区| 亚洲国产高清在线| 亚洲国产高清在线| 亚洲男人的天堂在线| 亚洲最新在线视频| 亚洲乱人伦精品图片| 456亚洲人成在线播放网站| 在线综合亚洲欧洲综合网站| 亚洲无码一区二区三区| 亚洲第一街区偷拍街拍| 亚洲成a人无码亚洲成av无码| 亚洲精品久久久久无码AV片软件| 亚洲精品自偷自拍无码| 日韩国产精品亚洲а∨天堂免| 亚洲a无码综合a国产av中文| 亚洲AⅤ视频一区二区三区| 狠狠色婷婷狠狠狠亚洲综合| 亚洲国产日韩在线视频| 亚洲色图国产精品| 亚洲国产超清无码专区| 99热亚洲色精品国产88| 亚洲av无码专区在线观看亚| 亚洲av日韩片在线观看| 一本久久a久久精品亚洲| 国产成人亚洲综合无码精品| 亚洲国产美国国产综合一区二区 | 亚洲精品日韩专区silk| 亚洲伦理一二三四| 亚洲乱码中文字幕在线| 亚洲电影日韩精品 | 亚洲乱码日产精品一二三| 国产亚洲情侣久久精品| 国产AV无码专区亚洲AWWW| 亚洲va中文字幕无码久久| 久久亚洲国产精品成人AV秋霞| 亚洲av乱码一区二区三区|