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

主站蜘蛛池模板: 原味小视频在线www国产| 一级黄色片网| 亚洲综合日韩精品| 国产精品一区二区不卡的视频| 欧美激情首页| 全部免费毛片免费播放| 波多野衣结在线精品二区| 国产精品乱偷免费视频| 国产不卡国语在线| a天堂视频| AV老司机AV天堂| 国产在线一区二区视频| 国产真实乱了在线播放| 国产又大又粗又猛又爽的视频| 欧美在线国产| 青青网在线国产| 色综合久久88色综合天天提莫| 在线观看免费国产| 国产自在线拍| 九九热这里只有国产精品| 国产在线观看第二页| 九九热视频精品在线| 国产精品网址在线观看你懂的| 中文字幕中文字字幕码一二区| 国产欧美中文字幕| 激情六月丁香婷婷四房播| 久热这里只有精品6| vvvv98国产成人综合青青| 伊人中文网| 伊伊人成亚洲综合人网7777| 国产精品刺激对白在线| 欧美日韩v| 成人无码一区二区三区视频在线观看| 青青青视频蜜桃一区二区| av一区二区三区高清久久| 日韩第一页在线| 五月婷婷精品| 色婷婷电影网| 成人免费网站久久久| 欧美精品另类| 日韩在线1| 99精品视频在线观看免费播放| 一级片一区| 成人国产精品一级毛片天堂| 国产精品无码在线看| 亚洲天堂色色人体| 高清免费毛片| 亚洲欧美不卡| 亚洲婷婷在线视频| 极品av一区二区| 亚洲码一区二区三区| 国产女人18毛片水真多1| 国产乱码精品一区二区三区中文 | 欧美日韩国产在线播放| a毛片在线免费观看| 一级看片免费视频| 99久久无色码中文字幕| 亚洲一区黄色| 久久黄色小视频| 99re在线免费视频| 欧美国产菊爆免费观看| 国产欧美成人不卡视频| 成人欧美在线观看| 色综合激情网| 欧美成人影院亚洲综合图| 精品国产电影久久九九| 久草热视频在线| 爆乳熟妇一区二区三区| 精品一区二区三区中文字幕| 色噜噜中文网| 亚洲美女高潮久久久久久久| 国产精品区视频中文字幕| 无码AV高清毛片中国一级毛片| 亚洲欧美另类色图| 五月激情综合网| 国产精品欧美激情| 91探花在线观看国产最新| 9久久伊人精品综合| 国产手机在线观看| 91精品啪在线观看国产91九色| 国产成人高清精品免费| 成人精品亚洲|