999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于S3C2440平臺(tái)的Linux內(nèi)核引導(dǎo)的過程實(shí)現(xiàn)

2016-08-11 00:40:52趙興海衡友躍

趙興海,衡友躍

(淮北職業(yè)技術(shù)學(xué)院 計(jì)算機(jī)科學(xué)技術(shù)系,安徽 淮北 235000)

?

基于S3C2440平臺(tái)的Linux內(nèi)核引導(dǎo)的過程實(shí)現(xiàn)

趙興海,衡友躍

(淮北職業(yè)技術(shù)學(xué)院 計(jì)算機(jī)科學(xué)技術(shù)系,安徽 淮北235000)

摘要:u-boot是一種通用型的引導(dǎo)程序,u-boot引導(dǎo)Linux內(nèi)核是一個(gè)復(fù)雜過程。在此主要介紹了Bootloader的作用和種類,并詳細(xì)分析u-boot引導(dǎo)Linux內(nèi)核的功能實(shí)現(xiàn)過程。

關(guān)鍵詞:Bootloader; u-boot;Linux內(nèi)核

1Bootloader簡(jiǎn)介

Bootloader是操作系統(tǒng)引導(dǎo)程序的總稱,它里面包含有很多種操作系統(tǒng)引導(dǎo)程序。由于設(shè)備的硬件架構(gòu)不同,有些是適合于某一種硬件架構(gòu)的針對(duì)型的引導(dǎo)程序,有些是適合于多種硬件架構(gòu)通用型的引導(dǎo)程序。Bootloader負(fù)責(zé)完成硬件設(shè)備的初始化,為軟件環(huán)境做準(zhǔn)備,最后把操作系統(tǒng)內(nèi)核調(diào)入到指定位置。[1]這些是它最基本的功能,可以根據(jù)開發(fā)的需要或使用的需要對(duì)它的功能進(jìn)行添加擴(kuò)展,讓它使用更加的方便高效,Bootloader對(duì)于Linux操作系統(tǒng)常見有LILO、GRUB、U-boot、Vivi等。LILO和GRUB常用于X86平臺(tái)的臺(tái)式機(jī),Vivi是針對(duì)于SAMSUNG的arm架構(gòu)的嵌入式設(shè)備,U-boot是一種通用的Linux內(nèi)核,它可以用于包括X86架構(gòu)、ARM架構(gòu)在內(nèi)的多種硬件架構(gòu)。U-boot和Vivi比較而言,U-boot能夠提供更多的下載方式和大量的命令,使用更加的廣泛。Bootloader的作用主要是實(shí)現(xiàn)內(nèi)核的引導(dǎo)、保存和傳遞Boot parameters(啟動(dòng)參數(shù))給操作系統(tǒng)內(nèi)核,如下圖所示;

圖1 Bootloader的作用和位置

2U-boot簡(jiǎn)介及啟動(dòng)過程

2.1U-boot簡(jiǎn)介

U-boot是一種通用型的引導(dǎo)程序,通用型不止表現(xiàn)在它適用于絕大多數(shù)的CPU架構(gòu),還體現(xiàn)在它能夠支持多種操作系統(tǒng)的引導(dǎo)。U-boot的最主要功能就是把Linux內(nèi)核進(jìn)行加載和運(yùn)行,由于U-boot和Linux內(nèi)核無(wú)法同時(shí)運(yùn)行,那么就需要通過U-boot來引導(dǎo)Linux內(nèi)核以及把U-boot初始化得到的硬件信息傳遞給內(nèi)核,讓內(nèi)核能夠更快的加載硬件驅(qū)動(dòng)運(yùn)行起來。一個(gè)操作系統(tǒng)除了內(nèi)核以外,還包括大量的驅(qū)動(dòng)程序、編譯語(yǔ)言、數(shù)據(jù)庫(kù)和其它工具。[2]Linux內(nèi)核由5個(gè)模塊組成:網(wǎng)絡(luò)接口模塊、進(jìn)程間通信模塊、文件系統(tǒng)模塊、內(nèi)存管理模塊和進(jìn)程調(diào)度模塊。[3]U-boot最核心的部分就是實(shí)現(xiàn)引導(dǎo)內(nèi)核的命令。U-boot的目錄里面含有二十多個(gè)子目錄,主要分為四類,分類如下;

第一類為開發(fā)板相關(guān)的目錄board子目錄,里面包括各種支持類型的電路板類似于電腦的主板。

第二類為平臺(tái)相關(guān)的目錄。CPU目錄里面包括了支持的不同CPU架構(gòu)子目錄。

Lib-i386(CPU架構(gòu)類型)的目錄里面包含了每一種架構(gòu)下通用的庫(kù)文件。

第三類為通用的函數(shù)類型目錄。inlcude目錄里面包括頭文件和常用的配置文件。common目錄里面是通用的函數(shù),多是對(duì)下一層驅(qū)動(dòng)程序的封裝。

第四類為通用的設(shè)備驅(qū)動(dòng)程序目錄。disk目錄里面主要是硬盤接口相關(guān)的程序。Drivers目錄里面包含了各種設(shè)備的驅(qū)動(dòng)程序。Dtt目錄里面是數(shù)字穩(wěn)定測(cè)量器或傳感器的驅(qū)動(dòng)。Fs目錄是文件系統(tǒng)相關(guān)的實(shí)現(xiàn)目錄。Nand-spl目錄保存的是支持U-boot從NAND Flash啟動(dòng)的代碼文件。Net目錄保存的是各種網(wǎng)絡(luò)協(xié)議代碼文件。Post目錄保存的是機(jī)器上電自檢程序文件。Rtc目錄保存的是實(shí)時(shí)時(shí)鐘的驅(qū)動(dòng)文件目錄。

2.2U-boot的啟動(dòng)過程

U-boot的啟動(dòng)過程可分為單階段和多階段兩種方式,多階段是為了讓U-boot能夠提供更多的功能。這里針對(duì)S3C2440開發(fā)板使用的是多階段的方式,使用了兩階段的方式實(shí)現(xiàn)啟動(dòng)過程。

第一個(gè)階段使用的是start.s匯編代碼實(shí)現(xiàn),內(nèi)容如下:

a.實(shí)現(xiàn)了開發(fā)板CPU體系包括看門狗、Interrupt 設(shè)置、處理器時(shí)鐘頻率、加載操作系統(tǒng)使用的RAM空間等)

b.為加載第二階段的U-boot代碼準(zhǔn)備RAM空間

c.復(fù)制第二階段的U-boot代碼到RAM空間

d.為第二階段代碼(C語(yǔ)言為主)的運(yùn)行設(shè)置好棧

e.跳轉(zhuǎn)到第二階段代碼的入口點(diǎn)。

第二階段的代碼主要實(shí)現(xiàn)的功能包括:

a.初始化本階段要使用的硬件設(shè)備

b.檢測(cè)系統(tǒng)內(nèi)存映射

c.將根文件系統(tǒng)和內(nèi)核鏡像從FLASH設(shè)備復(fù)制到RAM空間

d.為內(nèi)核配置啟動(dòng)選項(xiàng)

e.調(diào)用內(nèi)核使內(nèi)核運(yùn)行起來。

3U-boot的主要功能實(shí)現(xiàn)

U-boot引導(dǎo)Linux內(nèi)核功能主要有兩個(gè)部分,一個(gè)是引導(dǎo)內(nèi)核的命令,一個(gè)是傳遞內(nèi)核啟動(dòng)參數(shù)。

3.1U-boot引導(dǎo)內(nèi)核的命令功能實(shí)現(xiàn)

U-Boot的命令包括很多,包括下載文件的命令,幫助命令help、內(nèi)存操作、命令、NOR Flash操作命令、NAND Flash操作命令、環(huán)境變量命令、啟動(dòng)命令等。以啟動(dòng)命令為例闡述實(shí)現(xiàn)步驟。

首先在include/command.h文件中找到宏U-BOOT-CMD的定義。定義如下;

#define U-BOOT-k_CMD(k_name,k_maxargs,k_rep,k_cmd,k_usage,k_help)

Cmd_tbl_t __u_boot_k_cmd_##k_name Struct_Section = {#k_name,k_maxargs,k_rep,k_cmd,k_usage,k_help}

Struct_Section定義如下;

#define Struct_Section _attribute_(unused,section(“.u_boot_cmd”))

而在連接腳本U-BOOT.lds中有”.u_boot_cmd”的描述,如下;

__u_boot_cmd_start = .;

.u_boot_cmd : {*(.u_boot_cmd)}

__u_boot_cmd_end = .;

這里k_name為命令的字符串,k_maxargs為最大的參數(shù)個(gè)數(shù),k_rep標(biāo)識(shí)命令是否可重復(fù),cmd為實(shí)現(xiàn)命令功能的函數(shù)指針,k_usage為簡(jiǎn)短的使用說明,k_help為詳細(xì)的使用說明,_attribute_為函數(shù)具有的特殊屬性,.u_boot_cmd表示連接腳本中設(shè)計(jì)的專用于保存命令的特殊段。

對(duì)于命令bootm,定義如下;

U_BOOT_CMD{

Bootm,CFG_MAXARGS,1,do_bootm,

“String1”,

“String2”,

}

宏U_BOOT_CMD的定義擴(kuò)展開得到;

Cmd_tbl_t __u_boot_cmd_bootm _attribute__((unused,section(“.u_boot_cmd”)))

最后要為內(nèi)核設(shè)置啟動(dòng)參數(shù),在配置文件include/configs/smdk2440.h中增加如下兩個(gè)配置項(xiàng);

#define CONFIG_SETUP_MEMORY_TAGS

#define CONFIG_CMDLINE_TAG

通過lib_arm/armLinux.c中的do_bootm_Linux函數(shù)來啟動(dòng)內(nèi)核。這個(gè)函數(shù)先設(shè)置標(biāo)記列表,最后調(diào)用theKernel(0,bd→bi_arch_number,bd→bi_boot_params)函數(shù)來調(diào)用內(nèi)核。

3.2U-boot為內(nèi)核傳遞啟動(dòng)參數(shù)的實(shí)現(xiàn)

U-boot和內(nèi)核不能同時(shí)運(yùn)行,所以它們的傳遞方式是兩者約定好保存啟動(dòng)參數(shù)的地方,U-boot通過把參數(shù)放到事先約定好的位置,接著內(nèi)核啟動(dòng),到指定的地方把參數(shù)讀入內(nèi)核。啟動(dòng)參數(shù)包括三個(gè),分別是內(nèi)核存放的地址、board_init函數(shù)設(shè)置的機(jī)器類型ID和標(biāo)記列表的開始地址。

3.2.1內(nèi)核存放的地址

2.1.5 方法 照薄層色譜法(《中國(guó)藥典》2015年版四部通則0502)試驗(yàn)。吸取供試品溶液與對(duì)照藥材溶液各6μL、對(duì)照品溶液2μL、陰性對(duì)照溶液2μL,分別點(diǎn)于同一高效硅膠G薄層板上,以石油醚(60℃~90℃)-丙酮(9∶2)作展開劑,展開,取出,晾干,噴以10%硫酸乙醇溶液,加熱至斑點(diǎn)顯色清晰。在供試品色譜中,在與對(duì)照藥材色譜和對(duì)照品色譜相應(yīng)的位置上以上各溶液分別顯相同顏色的斑點(diǎn)。見圖1。

內(nèi)核存放的地址通過在連接腳步中定義。

3.2.2機(jī)器類型ID的參數(shù)bd→bi_arch_number

在 uboot/board/s3c2440/s3c2440.c的board_init函數(shù)中指定機(jī)器碼為:

gd->bd->bi_arch_number = MACH_TYPE_S3C2440

而MACH_TYPE_S3C2440定義在include/asm-arm/mach-types.h

3.2.3標(biāo)記列表的開始地址bd→bi_boot_params

a.在U_boot的保存形式

在U_boot中保存內(nèi)核采用參數(shù)使用的是一種叫標(biāo)記列表(tagged list)的格式進(jìn)行保存,里面使用標(biāo)記列表以ATAG_CORE開始,以標(biāo)記ATAG_NONE結(jié)束,具體的定義在文件include/asm/setup.h頭文件中。

Struct tag_header{

U32size;

U32 tag;

};

Structtag{

Struct tag_header hdr;

Union{

Struct tag_core core;

Structtag_mem32 mem;

……

}u;

b.內(nèi)核使用的方式為bd→bi_boot_params,理解傳遞為內(nèi)核函數(shù)參數(shù)形式需要理解兩個(gè)結(jié)構(gòu)體gd和bd,具體的定義如下:

gd結(jié)構(gòu)體的定義在include/asm-arm/global_data.h文件中。

c.保存的方式和傳遞的方式如何關(guān)聯(lián)

保存的時(shí)候使用的是指針paramas進(jìn)行存放,而傳遞的時(shí)候使用的bg類型的結(jié)構(gòu)體。那么就需要把它們關(guān)聯(lián)起來。

它們都在lib_arm/armLinux.c文件中定義,如下

static void setup_start_tag (bd_t *bd)

{

params = (struct tag *) bd->bi_boot_params; /* 內(nèi)核的參數(shù)的開始地址 */

……

}

4結(jié)論

u-boot引導(dǎo)Linux內(nèi)核是一個(gè)復(fù)雜的過程,要使用到啟動(dòng)命令和啟動(dòng)參數(shù)的傳遞功能。通過詳細(xì)分析u-boot引導(dǎo)Linux內(nèi)核的功能實(shí)現(xiàn)過程讓讀者能夠?qū)-boot與Linux內(nèi)核的關(guān)系更加的清晰,也對(duì)u-boot的階段啟動(dòng)有所了解。

參考文獻(xiàn):

[1]韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊(cè)[M].北京:人民郵電出版社,2008.

[2]宋寶華,等.精通Linux設(shè)備驅(qū)動(dòng)程序開發(fā)[M].北京:人民郵電出版社,2010.

[3]趙炯.Linux內(nèi)核完全注釋[M].北京:機(jī)械工業(yè)出版社,2004.

責(zé)任編輯:凈草

收稿日期:2016-06-30

基金項(xiàng)目:本文系安徽省高等學(xué)校省級(jí)質(zhì)量工程項(xiàng)目“計(jì)算機(jī)應(yīng)用技術(shù)專業(yè)綜合改革試點(diǎn)”(編號(hào):2013zy110)階段性研究成果。

作者簡(jiǎn)介:趙興海(1982-),男,安徽鳳陽(yáng)人,助教,研究放心為嵌入式系統(tǒng)工程。

中圖分類號(hào):TP368.1

文獻(xiàn)標(biāo)識(shí)碼:A

文章編號(hào):1671-8275(2016)04-0134-03

主站蜘蛛池模板: 老司机午夜精品网站在线观看| 亚洲精品无码专区在线观看| 国产凹凸视频在线观看| 在线a网站| 中文字幕人成人乱码亚洲电影| www.精品国产| 国产9191精品免费观看| 国产美女91呻吟求| 手机成人午夜在线视频| 青青草国产免费国产| 欧美成人手机在线观看网址| 国产91av在线| 在线播放真实国产乱子伦| 亚洲欧美h| 国产精品精品视频| 国产91av在线| 亚洲性色永久网址| 国产XXXX做受性欧美88| 国产精品久久久久无码网站| 欧美精品亚洲二区| 国产成人免费手机在线观看视频 | 免费A∨中文乱码专区| 欧美午夜理伦三级在线观看| 国产精品嫩草影院av| 国产白浆在线| 久久综合国产乱子免费| 亚洲自偷自拍另类小说| 精品人妻系列无码专区久久| 亚洲福利网址| 亚洲国产AV无码综合原创| 日本91视频| 日韩av无码精品专区| 国产成人毛片| 国产福利影院在线观看| 成人综合在线观看| 亚洲欧美不卡视频| 99精品高清在线播放| 伊人色婷婷| 国产精品亚洲片在线va| 国产小视频a在线观看| 91麻豆精品国产高清在线| 亚洲Av综合日韩精品久久久| 亚洲乱码精品久久久久..| 制服丝袜一区二区三区在线| 国产一区二区三区免费| 99在线观看精品视频| 天堂在线www网亚洲| 澳门av无码| 18禁黄无遮挡网站| 欧美激情一区二区三区成人| 久久99久久无码毛片一区二区| 亚洲福利片无码最新在线播放| 国产精品久久久久久久久| 国产精品一区二区在线播放| 中文字幕在线免费看| 欧美色图第一页| 中国国产A一级毛片| 久久国产精品77777| 亚洲成人www| 国产精品视频免费网站| 9999在线视频| 国产成人a在线观看视频| 成人自拍视频在线观看| 一级毛片免费的| 欧美va亚洲va香蕉在线| 在线国产三级| 一本大道视频精品人妻| 久久中文电影| 欧美日韩免费观看| 国产拍揄自揄精品视频网站| 91口爆吞精国产对白第三集| 国产无码精品在线播放| 97一区二区在线播放| 99re这里只有国产中文精品国产精品| 二级特黄绝大片免费视频大片| 精品夜恋影院亚洲欧洲| 激情午夜婷婷| 国产成人精品第一区二区| 日本欧美成人免费| 中文字幕无码中文字幕有码在线| 日本成人福利视频| 国产黄在线观看|