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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

uboot引导linux内核,u-boot启动内核的几种方式

發(fā)布時(shí)間:2025/3/8 linux 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 uboot引导linux内核,u-boot启动内核的几种方式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.uboot啟動(dòng)內(nèi)核的代碼縮減如下:

s = getenv ("bootcmd");

debug ("### main_loop: bootcmd=\"%s\"\n", s ? s : "");

if (bootdelay >= 0 && s && !abortboot (bootdelay))

{run_command (s, 0);

}

2.假設(shè)bootcmd = nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0

<1> nand read.jffs2 0x30007FC0 kernel

nand read.jffs2 0x30007FC0 kernel;

從nand讀出內(nèi)核:從哪里讀??? 從kernel分區(qū)

放到哪里去?-0x30007FC0

下面講解什么是分區(qū):

就是將nand劃分為幾個(gè)區(qū)域,一般如下:

bootloader-》params-》kernel-》root

這些分區(qū)的劃分是在/include/configs/mini2440.h中寫死的:

#define MTDPARTS_DEFAULT "mtdparts=nandflash0:250k@0(bootloader)," \

"128k(params)," \

"5m(kernel)," \

"-(root)"

注:@0表示從0地址開(kāi)始,250k的bootloader分區(qū)可能對(duì)某些uboot不夠用,這里只是舉例而已。

將上面的信息換算成十六進(jìn)制:

#????name???????????? 大小????????在nand上的起始地址

0????bootloader???? 0x00040000????????0x00000000

1????params????????0x00020000??????????????0x00040000

2????kernel????????0x00200000????????0x00060000

3????root????????0xfda00000????????0x00260000

那么上面的nand read.jffs2 0x30007FC0 kernel就等價(jià)于:

nand read.jffs2 0x30007FC0 0x00060000 0x00200000

注:這里的read.jffs2并不是指定要什么特定的格式,而是用read.jffs2不需要塊/頁(yè)對(duì)齊,所以這個(gè)kernel的分區(qū)大小可以

隨意定。

<2> bootm 0x30007FC0

關(guān)鍵函數(shù)do_bootm()

flash上存的內(nèi)核:uImage

uImage = 頭部+真正的內(nèi)核

頭部的定義如下:

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????????*/

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;

我們需要關(guān)心的是:

uint32_t????ih_load;????/* Data???? Load??Address????????*/

uint32_t????ih_ep;????????/* Entry Point Address????????*/

ih_load是加載地址,即內(nèi)核運(yùn)行是應(yīng)該位于的地方

ih_ep是入口地址,即內(nèi)核的入口地址

這與uboot是類似的,uboot的加載地址是TEXT_BASE = 0x33F80000;入口地址是start.S中的_start。

其實(shí)我們把內(nèi)核中nand讀出來(lái)的時(shí)候是可以放在內(nèi)核的任何地方的,如0x31000000,0x32000000等等,只要它不破壞uboot所占用的內(nèi)存空間就可以了,如下圖:

從0x33F4DF74-0x30000000都是可以用的。

那么為什么既然設(shè)定好了加載地址和入口地址內(nèi)核還能隨意放呢?

那是因?yàn)閡Image有一個(gè)頭部!頭部里有加載地址和入口地址,當(dāng)我們用bootm xxx的時(shí)候,

do_bootm這個(gè)函數(shù)會(huì)先去讀uImage的頭部以獲取該uImage的加載地址和入口地址,當(dāng)發(fā)現(xiàn)該uImage目前所處的內(nèi)存地址不等于它的加載地址時(shí),該函數(shù)會(huì)將該uImage移動(dòng)到它的加載地址上,在代碼中體現(xiàn)如下:

case IH_COMP_NONE::

if (load != image_start)

{

memmove_wd ((void *)load, (void *)image_start, image_len, CHUNKSZ);

}

另外,當(dāng)我們的內(nèi)核正好處于頭部指定的加載地址的話,那么就不用uboot的do_bootm函數(shù)來(lái)幫我們搬運(yùn)內(nèi)核了,這樣可以節(jié)省啟動(dòng)時(shí)間。這就是為什么我們一般都下載uImage到

0x30007FC0的原因了!

我們所用的內(nèi)核加載地址是0x30008000,而頭部的大小為64個(gè)字節(jié),所以將內(nèi)核拷貝到0x30007FC0時(shí),再加載頭部的64個(gè)字節(jié),內(nèi)核正好位于0x30008000處!

現(xiàn)在總結(jié)bootm做了什么:

1.????讀取頭部

2.????將內(nèi)核移動(dòng)到加載地址

3.????啟動(dòng)內(nèi)核

具體如何啟動(dòng)內(nèi)核?

使用do_bootm_linux(),在/lib_arm/bootm.c定義,因?yàn)槲覀円呀?jīng)知道入口地址了,所以只需跳到入口地址就可以啟動(dòng)linux內(nèi)核了,但是在這之前需要做一件事————uboot傳遞參數(shù)給內(nèi)核!!

現(xiàn)在來(lái)分析do_bootm_linux()這個(gè)函數(shù):

theKernel = (void (*)(int, int, uint))images->ep;//先是將入口地址賦值給theKernel

theKernel (0, machid, bd->bi_boot_params);//然后是調(diào)用thekernel

函數(shù),以0,machid,bd->bi_boot_params作為參數(shù)

下面分析這三個(gè)參數(shù):

1.machid就是uboot里設(shè)置好的板子的機(jī)器碼,mini2440的是MACH_TYPE_MINI2440 (1999),內(nèi)核所設(shè)置的機(jī)器碼和uboot所設(shè)置的機(jī)器碼必須一致才能啟動(dòng)內(nèi)核

2.bd->bi_boot_parmas就是uboot需傳遞給內(nèi)核的啟動(dòng)參數(shù)所位于的地址

3.0暫時(shí)還不知道什么作用/**********************************************/

那么uboot傳給內(nèi)核的啟動(dòng)參數(shù)是在哪里設(shè)置的呢?

其實(shí)就是在調(diào)用????theKernel (0, machid, bd->bi_boot_params);前面的一小段代碼里設(shè)置的,下面我截取了部分片段:

setup_start_tag (bd);

setup_revision_tag (&params);

setup_memory_tags (bd);

setup_commandline_tag (bd, commandline);

setup_initrd_tag (bd, images->rd_start, images->rd_end);

setup_videolfb_tag ((gd_t *) gd);

setup_end_tag (bd);

每一個(gè)啟動(dòng)參數(shù)對(duì)應(yīng)一個(gè)tag結(jié)構(gòu)體,所謂的設(shè)置傳遞參數(shù)其實(shí)就是初始化這些tag的值,想了解這個(gè)結(jié)構(gòu)體以及這些tag的值是如何設(shè)置的請(qǐng)看韋東山的書關(guān)于uboot移植章節(jié)!

下面我們看一下setup_start_tag(bd)這個(gè)函數(shù)先:

static void setup_start_tag (bd_t *bd)

{

params = (struct tag *) bd->bi_boot_params;

//在board.c中有一句gd->bd->bi_boot_params = 0x30000100,這里設(shè)置了參數(shù)存放的位置

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);

}

我們?cè)賮?lái)看下setup_commandline_tag (bd, commandline);這個(gè)函數(shù):

static void setup_commandline_tag (bd_t *bd, char *commandline)

{

// commandline就是我們的bootargs

char *p;

if (!commandline)

return;

for (p = commandline; *p == ' '; p++);

if (*p == '\0')

return;

params->hdr.tag = ATAG_CMDLINE;

params->hdr.size =

(sizeof (struct tag_header) + strlen (p) + 1 + 4) >> 2;

strcpy (params->u.cmdline.cmdline, p);

params = tag_next (params);

}

Linux內(nèi)核啟動(dòng)時(shí)就會(huì)去讀取這些tag參數(shù)

總結(jié)

以上是生活随笔為你收集整理的uboot引导linux内核,u-boot启动内核的几种方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 黄色片视频免费 | 欧美高清视频一区 | 亚洲美女一区 | 国产精品呻吟久久 | 激情图片区 | 女王人厕视频2ⅴk | 成人午夜激情影院 | 医生强烈淫药h调教小说视频 | 日本高清在线一区 | 中文字幕av免费 | 五月激情视频 | 男女草逼| 人人艹人人 | 日日涩| 婷婷在线影院 | 国模视频一区 | 午夜影院欧美 | 国产69久久精品成人看 | 色爽影院| 国产精品成人无码免费 | 五月丁香 | 在线观看91av | 美女露胸软件 | jizz成熟丰满日本少妇 | 中文字幕一区二区三区在线不卡 | 天天爽天天爱 | 一区二区欧美精品 | 免费一级黄色大片 | 99黄色网 | 国产亚洲美女精品久久久2020 | 美丽的姑娘观看在线播放 | sm在线观看 | 欧洲av无码放荡人妇网站 | 中文字幕在线观看你懂的 | 中文字幕免费播放 | 美女av免费在线观看 | 黄色麻豆视频 | 久久久中文字幕 | 草草影院在线免费观看 | 亚洲福利一区二区三区 | 欧美aaa大片 | 国产激情无码一区二区 | 在线播放第一页 | 欧美人与性动交α欧美片 | 亚洲欧美国产精品久久久久久久 | 精品亚洲永久免费 | 中文字幕一区二区人妻 | 永久免费在线观看av | 欧美精品xxx | 99热青青草| 中文字幕人成乱码熟女香港 | 中文字幕一区二区三区乱码 | 国产模特av私拍大尺度 | 日韩一级色片 | 激情都市一区二区 | 久久精品无码一区二区三区毛片 | 特黄aaaaaaaaa真人毛片 | 国产日韩免费 | 亚洲欧美综合在线观看 | 精品无码黑人又粗又大又长 | 久久亚洲精精品中文字幕早川悠里 | 91国产在线播放 | 夫妻自拍偷拍 | 蜜臀av一区二区三区 | 日韩一区2区 | 国产综合精品视频 | 中文字幕在线不卡视频 | 中文字幕在线2018 | 久久久精品区 | 深夜在线视频 | 一曲二曲三曲在线观看中文字幕动漫 | 日韩精品久久久久久免费 | 亚洲成人生活片 | 黄色一级一片免费播放 | 97视频免费看 | 亚洲综合色在线观看 | 国产第页 | 天天操夜夜撸 | 日韩精品一卡二卡 | 日韩欧美在线观看免费 | 国产视频二 | 日韩作爱视频 | 爱爱综合网 | 欧美日韩网 | 丁香婷婷亚洲 | 在线cao| 国产美女自拍视频 | 极品美女一区二区三区 | 欧美三级午夜理伦三级小说 | 亚洲va在线 | 蜜桃综合网 | aaa成人 | 成人午夜免费网站 | 日本一区二区精品视频 | 黄频在线观看 | 日韩高清片 | 国产99视频在线观看 | 国产色吧| 欧美性aaa|