亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于嵌入式S3C2440系統(tǒng)Bootloader設計與實現(xiàn)

        2016-11-17 08:55:58范蟠果邢保毫米曉亮余書寶
        計算機測量與控制 2016年9期
        關鍵詞:內核內存代碼

        范蟠果,邢保毫,米曉亮,余書寶, 王 婷

        (西北工業(yè)大學 自動化學院,西安 710129)

        ?

        基于嵌入式S3C2440系統(tǒng)Bootloader設計與實現(xiàn)

        范蟠果,邢保毫,米曉亮,余書寶, 王 婷

        (西北工業(yè)大學 自動化學院,西安 710129)

        Bootloader是嵌入式系統(tǒng)的一個重要環(huán)節(jié),對不同的硬件平臺,其Bootloader都不盡相同,因此設計Bootloader是嵌入式系統(tǒng)開發(fā)的難點;文中分析S3C2440嵌入式系統(tǒng)的硬件組成和u-boot源碼對linux內核的啟動流程,得出u-boot啟動內核兩個階段必備階段:第一個階段是用匯編初始與具體硬件平臺相關的操作等,第二階段是用C語言編寫復雜功能以及啟動內核;以加載linux-2.6.22.6內核為例,根據(jù)u-boot啟動內核兩個階段所做的工作,設計出適用于S3C2440嵌入式系統(tǒng)的精簡Bootloader;通過實驗表明,該設計的Bootloader成功啟動linux內核,具有良好的穩(wěn)定性,可靠性和簡潔性。

        系統(tǒng)設計;分析u-boot;實現(xiàn)Bootloader;啟動內核

        0 引言

        Bootloader是嵌入式系統(tǒng)內核運行前的一段程序,這段程序初始化硬件設備,并且建立一個內存空間映射圖,從而建立適當?shù)南到y(tǒng)軟硬件環(huán)境,為最終啟動內核和加載文件系統(tǒng)做準備[1]。由于Bootloader依賴于硬件,它與處理器架構,具體設計的硬件平臺資源相關,因此設計一個適合某平臺的Bootloader是開發(fā)嵌入式系統(tǒng)重要工作。

        在設計引導程序時,一般會移植u-boot開源代碼,但是這樣代碼量大,占用較大存儲空間;本文通過分析u-boot啟動流程,根據(jù)硬件平臺資源,設計一個精簡,穩(wěn)定的Bootloader。

        1 u-boot 分析

        1.1 u-boot啟動流程分析

        分析支持S3C2410的u-boot源代碼,具體啟動流程分析如圖1所示。

        圖1 u-boot啟動流程

        根據(jù)分析得出啟動過程一般分為兩個階段。

        stage1:主要通過匯編來實現(xiàn)和硬件相關代碼:硬件設備初始化,加載u-boot第二段代碼到RAM空間,設置好棧,跳轉到第二段代碼入口[2]。

        stage2:主要用C語言來實現(xiàn)一些復雜的功能:初始化本階段使用的硬件設備,檢測系統(tǒng)內存映射,將內核從flash讀取到RAM中,為內核設置啟動參數(shù),調用內核[2]。

        1.2 u-boot編譯以及大小分析

        u-boot在編譯之前,需要編寫好Makefile和連接文件u-boot.lds,然后通過make命令編譯生成u-boot.bin;Makefile規(guī)定u-boot所有函數(shù)的依賴關系;連接文件u-boot.lds指定u-boot編譯的連接地址,第一個被編譯的文件,存放的代碼段,數(shù)據(jù)段以及BSS段的位置。

        如下面一個連接文件u-boot.lds:

        SECTIONS

        {

        . = 33f00000;//指定的連接地址

        .text ://代碼段

        {

        _start = .;//代碼段開始位置

        arch/arm/cpu/arm920t/start.o (.text)//執(zhí)行編譯的第一個文件start.S

        ... }

        .data ://數(shù)據(jù)段

        .....

        __bss_start = .;//BSS段開始位置,此處為u-boot.bin大小結束位置

        ......}

        BSS段是由靜態(tài)和未初始化的全局變量組成,不會被編譯到u-boot.bin中。

        由連接文件可知u-boot的大小為__bss_start 地址減去_start的地址 ,可以查看u-boot的反匯編得到具體的大小,執(zhí)行arm-linux-objdump -D u-boot > u-boot.dis命令來生成如下u-boot.dis反匯編文件,:{

        Disassembly of section .text:

        33f00000 <_start>:注釋:代碼開始位置,和連接文件中的連接地址一致

        33f00000: ea000013 b 33f00054

        ......

        33f00044 <_bss_start_ofs>:

        33f00044: 00069c4c .word 0x00069c4c

        .......} 注釋:在啟動文件start.S中定義一個表示u-boot.bin大小的全局變:

        .globl _bss_start_ofs

        _bss_start_ofs:

        .word __bss_start - _start

        編譯的u-boot.bin大小為(0x00069c4c)423 KB,占有很大存儲空間。由于u-boot是一個支持多平臺的源代碼,所以它的結構復雜,若要讓這個u-boot成功應用到S3C2440系統(tǒng)上,需要對u-boot源代碼進行裁剪,并且添加支持平臺外設的代碼,工作量比較大,而且不便于調試。所以很有必要設計適用S3C2440系統(tǒng)的Bootloader,具體設計如下。

        2 系統(tǒng)設計

        2.1 硬件設計

        圖2 是一個基于ARM嵌入式系統(tǒng)硬件框圖,S3C2440芯片是基于ARM920T的架構處理器,片內有4 k的SRAM,nandflash控制器,SDRAM控制器等資源。板級設備包含:全功能的串口,JTAG,Nandflash (256 M), SDRAM(64 M)等。

        圖2 硬件平臺框圖

        2.2 系統(tǒng)軟件內存設計

        1)根據(jù)S3C2440手冊可知SDRAM映射在BANK7,所以起始地址為0x30000000;結束地址為0x34000000。在調用C語言之前要設置棧指針,ARM棧是往下增長的,設計棧指針為0x34000000。為給內核以及文件系統(tǒng)留有足夠的內存,設置啟動代碼連接地址為0x33f80000。內核編譯后大小不超過2 M,設計內核連接地址為0x30008000。內核把啟動參數(shù)放在0x30000100位置處,具體內存分布如圖3。

        2)Nandflash是存儲程序和數(shù)據(jù),掉電后能保存數(shù)據(jù)和程序,所以啟動代碼和內核都存放nandflash中,為了保證兩者代碼不覆蓋,設計Bootloader存儲的起始地址為0x0,內核存儲的起始地址為0x60000。

        根據(jù)設計的存儲空間和內存分配,兩者的映射關系如圖3所示。

        圖3 映射空間圖

        3)代碼重定位。

        根據(jù)兩者映射關系,需要對代碼進行重新定位,詳細分析如下:

        由于cpu對nandflash讀取是以塊(2 048 KB)為單位的,所以不能在nandflash上運行程序。當系統(tǒng)上電或者重啟時,硬件自動把存儲器中前4 KB代碼拷貝到cpu內部SRAM(映射地址為0);對于連接地址為0x33f80000的代碼若要成功運行在地址為0的內存中,在設計代碼時必須使用位置無關指令。通過運行在SRAM程序把nandflash中啟動代碼和內核拷貝到SDRAM,然后通過一條跳轉指令,使PC指向SDRAM。

        3 Bootlaoder軟件實現(xiàn)

        根據(jù)分析得到u-boot啟動流程,以及分配好的內存,下面針對S3C2440特定的嵌入式系統(tǒng),實現(xiàn)一個完整的Bootloader。

        3.1 第一階段

        Stage1主要是完成,建立向量表,初始化硬件,設置堆棧,把Bootloader拷貝到內存中,具體流程如圖4所示。

        圖4 Bootloader一階段流程

        (1)設置ARM異常向量表。

        根據(jù)ARM920T的架構可知,異常向量入口地址從0x00000000開始到0x0000001c結束,分別設置對應入口地址,當一個異常或中斷發(fā)生時,處理器會把pc指向對應中斷向量的入口地址。

        2)設置相關硬件。

        設置時鐘,使CPU主頻為400 MHz;屏蔽中斷;初始化串口以便于調試。

        3)初始化SDRAM。

        SDRAM用來運行啟動代碼和內核,必須對其進行設置,SDRAM控制器的寄存器,包含處理器對SDRAM讀寫訪問的時序,數(shù)據(jù)寬度;系統(tǒng)使用兩片16位數(shù)據(jù)接口的K4S561632N,其數(shù)據(jù)寬度為32位。

        4)設置堆棧指針。

        Bootloader在啟動階段是運行在管理模式下,只需設置管理模式下的堆棧指針(向下增長),代碼為: ldr sp, =0x34000000;設置成功后就可以調用C語言代碼。

        5)nandflash的初始化。

        由于需要把存儲在nandflash的啟動代碼和內核讀入SDRAM,所以要設置nandflash控制器的寄存器,設置cpu對存儲器讀寫時序,以及數(shù)據(jù)寬度。

        6)把啟動代碼拷貝到SDRAM執(zhí)行。

        SDRAM配置成功后,就可以從nandflash拷貝Bootloader啟動代碼到內存中運行;具體代碼如下:

        mov r0, 0 /*從nandflash 的0x0地址開始拷貝*/

        ldr r1, =_start /*這個值是由連接腳本確定為0x33f80000*/

        ldr r2, =__bss_start /*Bootlaoder代碼結束位置*/

        sub r2, r2, r1 /*獲得拷貝的大小*/

        bl copy_code_to_sdram / *從nandflash拷貝到SDRAM*/

        ldr pc, =main /*重新給pc賦值,跳轉到SDRAM中,開始執(zhí)行第二階段代碼*/

        3.2 第二階段

        Stage2的主要工作設置內核啟動參數(shù),拷貝內核到內存中,然后啟動內核,具體流程如如圖5所示。

        圖5 Bootloader二階段流程

        1)設置內核啟動參數(shù)。

        Bootloader和內核之間參數(shù)傳遞是單向的,Bootloader將參數(shù)放在某個約定地址[3](0x30000100),再啟動內核,啟動后會從0x30000100地址處取參數(shù)。

        內核啟動前會檢查傳入的參數(shù),比如內存的大小,命令等參數(shù)。因為 Linux2.6.22.6內核檢查參數(shù)以標記ATAG_CODE開始,以標記ATAG_NONE結束。詳細結構體可以參考linux內核源碼include/asm/setup.h頭文件。

        以設置參數(shù)開始ATAG_CODE標記為例:

        void setup_start_tag(void)

        {

        params = (struct tag *)0x30000100; /*約定的存放參數(shù)的起始地址*/

        params->hdr.tag = ATAG_CODE; /*參數(shù)標記*/

        .......

        params = tag_next (params); /*指向下一個參數(shù)*/

        }

        其他參數(shù)設置 如內存標記ATAG_MEM:告訴內核開發(fā)平臺外設SDRAM內存起始地址和大??;命令行標記ATAG_CMDLINE:用來控制內核一些行為,結束標記ATAG_NONE用來標記參數(shù)結束[3]。

        最后配置的參數(shù)結束標記:

        void setup_end_tag(void)

        { params->hdr.tag = ATAG_NONE;

        }

        設置參數(shù)具體代碼:

        puts("Set boot param "); /*打印提示信息*/

        setup_start_tag(); /*設置起始參數(shù)*/

        setup_memory_tags(); /*設置內存參數(shù)*/

        setup_commandline_tag("noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0"); /*設置命令參數(shù)*/

        setup_end_tag(); /*參數(shù)設置結束*/

        2)把內核從flash中拷貝到內存的0x30008000地址處。

        編譯內核是通過執(zhí)行:make uImage生成內核影像uImage;用JTAG把內核影像uImage 下載到nandflash的0x60000處,但是uImage開始的64字節(jié)表示內核頭幀數(shù)據(jù),真正的內核是從0x60000+64地址開始。具體拷貝代碼如下:

        nand_read(0x60000+64, (unsigned char *)0x30008000, 0x200000);

        第一個參數(shù): 0x60000+64代表的是內核起始地址

        第二個參數(shù):0x30008000代表是在SDRAM中內核的運行起始地址

        第三個參數(shù):0x200000 代表從nandflash拷貝2M(內核大小一般小于2M)大小程序到SDRAM中。

        3)啟動內核。

        根據(jù)分析u-boot源程序可知;啟動內核的過程就是把內核在SDRAM的連接地址賦值給一個能啟動內核的函數(shù)指針;然后通過調用此函數(shù)指針把機器類型ID(S3C2440的ID為362)和啟動參數(shù)在SDRAM中的起始基地址(0x30000100)傳遞給內核[4]。

        調用內核具體代碼:

        void (*theKernel)(int zero, int arch, unsigned int params);/*聲明啟動內核的函數(shù)指針*/

        theKernel = (void (*)(int, int, unsigned int))0x30008000;/*把內核在SDRAM中起始地址賦值給函數(shù)指針*/

        puts("Boot kernel ");/*打印提示信息*/

        theKernel(0, 362, 0x30000100); /*啟動內核*/

        puts("error ");/*如果內核啟動成功,就不會執(zhí)行這一句,否則會打印出error:表示沒有成功啟動內核*/

        4 實驗結果與分析

        為了測試設計的Bootloader是否具備穩(wěn)定和可靠特點,需要在嵌入式S3C2440平臺多次測試是否能啟動內核,并分析Bootloader是否具備精簡性。

        4.1 Bootloader精簡性分析

        在編寫B(tài)ootloader的start.S文件中定義一個全局變量來計算Bootloader大小,具體代碼如下:

        .globl _boot_size

        _boot_size:

        .word __bss_start - _start反匯編結果顯示如下:

        33f80000 <_boot_size>:

        33f80000: 00000730 andeq r0, r0, r0, lsr r7

        則代碼大小為_boot_size地址處值:0x0000730=1.79 KB,所以遠遠小于u-boot.bin的432 KB, 節(jié)省大量的存儲空間,說明設計的Bootloader具有精簡性。

        4.2 Bootloader穩(wěn)定和可靠性分析

        把編譯后的Bootloader下載到nandflash中,經過多次按下復位鍵后都能成功啟動linux內核。圖6顯示啟動結果:

        圖6 啟動結果

        5 結束語

        通過實驗可知,編寫的Bootloader比u-boot源碼簡潔,代碼量小,并且成功加載linux內核,通過借鑒u-boot源代碼的流程,以S3C2440為平臺,設計出了精簡,穩(wěn)定的Bootloader。該設計方法具有一定通用性,對于其他不同平臺,具有很強借鑒性。

        [1]劉 坤,韓朝智. 淺析基于ARM嵌入式開發(fā)的BootLoader設計及其實現(xiàn)[J]. 電子技術與軟件工程,2016(2):203-204.

        [2] 范展源,六 韜.深度實踐嵌入式Linux系統(tǒng)移植[M]北京:機械工業(yè)出版社,2015.

        [3] 韋東山.嵌入式linux應用開發(fā)[M],北京:人民郵電出版社,2008.

        [4] 戚長城,等.總線式ECU兩級Bootloader的設計與實現(xiàn)[J]. 計算機工程,2015(7):95-99.

        Development and Implement of Bootloader Based on S3C2440 and Embedded Linux System

        Fan Panguo, Xing Baohao , Mi Xiaoliang, Yu Shubao,Wang Ting

        (College of Automation,Northwestern Polytechnical University,Xi’an 710129,China)

        Bootloader is the important part of embedded system. For the different hardware platforms, Bootloader is different. So bootloader is the difficult for the developmemt of embedded system. This paper mainly analyzes the design of embedded S3C2440 system and the process of u-boot startup kernel, drawing two essential phases of u-boot startup kernel, the first phase is to use assembler language to write some functions of the specific hardware platforms ,The second phase is to use C language to write codes about some complicated functions and loading the kernel.For example,Loading the linux-2.6.22.6,according to the two stages work of u-boot startup kernel. Designing of streamlined Bootloader is suitable for the S3C2440 embedded system.Experiment shows that the design of Bootloader successfully starts the linux kernel ,and has a good stability,reliability and simplicity.

        design system; analyze u-boot; realize Bootloader;load kernel

        2016-03-30;

        2016-04-18。

        范蟠果(1960-),男,陜西西安人,碩士生導師,副教授,主要從事計算機測控方向的研究。

        1671-4598(2016)09-0012-03

        10.16526/j.cnki.11-4762/tp.2016.09.004

        TP273

        A

        猜你喜歡
        內核內存代碼
        萬物皆可IP的時代,我們當夯實的IP內核是什么?
        強化『高新』內核 打造農業(yè)『硅谷』
        “春夏秋冬”的內存
        當代陜西(2019年13期)2019-08-20 03:54:22
        基于嵌入式Linux內核的自恢復設計
        Linux內核mmap保護機制研究
        創(chuàng)世代碼
        動漫星空(2018年11期)2018-10-26 02:24:02
        創(chuàng)世代碼
        動漫星空(2018年2期)2018-10-26 02:11:00
        創(chuàng)世代碼
        動漫星空(2018年9期)2018-10-26 01:16:48
        創(chuàng)世代碼
        動漫星空(2018年5期)2018-10-26 01:15:02
        基于內存的地理信息訪問技術
        欧美日韩午夜群交多人轮换| 妺妺窝人体色www在线直播| 老熟女一区二区免费| 亚洲国产综合精品一区最新| 一个人看的视频在线观看| 天堂资源中文最新版在线一区| 一区二区国产在线观看| 亚洲精品白浆高清久久| 三级国产高清在线观看| 国内精品久久久久久99| 日韩电影一区二区三区| 偷拍网日本一区二区三区| 国产丝袜长腿在线看片网站| 人妻中文字幕乱人伦在线| 99久久久无码国产精品试看| 欧美性爱一区二区三区无a| 精品不卡视频在线网址| 精品在免费线中文字幕久久| 亚洲一区二区三区毛片| 97成人精品国语自产拍| 性激烈的欧美三级视频| 久久福利青草精品资源| 国产白浆大屁股精品视频拍| 午夜熟女插插xx免费视频| 日本高清色倩视频在线观看| 久久这里有精品国产电影网| 免费视频亚洲一区二区三区| 丰满少妇a级毛片| 射精情感曰妓女色视频| 亚洲双色视频在线观看| 青青草亚洲视频社区在线播放观看 | 久久精品亚洲热综合一本色婷婷| 国产高清av在线播放| 8888四色奇米在线观看| 丰满人妻中文字幕乱码| 国产高清在线视频一区二区三区| 麻豆国产原创视频在线播放| 久久国产免费观看精品| 日本女优久久精品久久| 日本高清视频永久网站www| 福利片福利一区二区三区 |