新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > Bootloader/u-boot的啟動模式

        Bootloader/u-boot的啟動模式

        作者: 時間:2016-11-24 來源:網(wǎng)絡 收藏
        對于計算機系統(tǒng)來說,從計算機開機上電的到操作系統(tǒng)的啟動需要一個引導過程。嵌入式Linux同樣也需要一個引導的過程,及引導程序就叫做Bootloader。Bootloader是在操作系統(tǒng)啟動之前執(zhí)行的一小段程序,通過這段小程序,我們可以初始化硬件設備、建立內(nèi)存空間映射表,從而建立適當系統(tǒng)軟硬件環(huán)境,為最終調(diào)用操作系統(tǒng)內(nèi)核做好準備。
        對于嵌入式系統(tǒng),Bootloader是基于特定平臺來實現(xiàn)的,因此幾乎不可能為所有的計算機操作系統(tǒng)建立一個通用的Bootloader,不同的處理器架構(gòu)都有不同的Bootloader,Bootloader不但依賴于CPU的體系結(jié)構(gòu),而且依賴于嵌入式系統(tǒng)板級的設備的配置。對于兩塊不同的嵌入式開發(fā)板,即使他們使用同一種處理器,要想讓運行于一塊板子上的Bootloader運行在另一塊板子上,一般都需要修改Bootloader源程序。
        反過來大多數(shù)的Bootloader都具有很多的共性,某些Bootloader也能夠支持多種體系結(jié)構(gòu)的嵌入式系統(tǒng)。例如:u-boot就同時支持Powerpc、ARm、MIPS和X86等等的體系結(jié)構(gòu),支持的板子有上百種,通常他們都能夠自動從存儲介質(zhì)上啟動,都能夠引導操作系統(tǒng)啟動,并且大部分都可以支持串口和網(wǎng)口的操作。
        系統(tǒng)加電或者復位后,cpu通常都會從某個地址開始執(zhí)行,這是由處理器決定的,對于ARM處理器而言會從0x00000000取第一條指令,嵌入式系統(tǒng)的開發(fā)板都要把ROM和FLASH映射到這個地址上,因此必須將Bootloader的程序存儲在相應的FLASH位置,這樣系統(tǒng)加電后就會首先執(zhí)行它。

        u-boot的啟動一般流程:
        第一階段:依賴cpu初始化外圍硬件代碼,通常用匯編代碼實現(xiàn)
        1、設置cpu的工作模式;
        2、關(guān)中斷,以防止意外發(fā)生;

        mrs r0,cpsr//讀取cpsr中的數(shù)據(jù)到r0中
        bic r0,r0,#0x 1f//將寄存器r0的值和0x1f的反碼安位與之后將結(jié)果存儲在r0中相當于清零
        orr r0,r0,#0xd3//將寄存器r0的值和0xd3 安位或之后將結(jié)果保存在r0寄存器之中,關(guān)閉中斷
        msr cpsr,r0//將cpsr中的數(shù)值寫到r0寄存器中
        3、關(guān)閉看門狗,避免系統(tǒng)重啟;
        #ifdefined(CONFIG_S3C2400)||defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)

        # if defined(CONFIG_S3C2400)
        # define pWTCON 0x15300000
        # define INTMSK 0x14400008
        # define CLKDIVN 0x14800014
        #else
        # define pWTCON 0x53000000
        # define INTMSK 0x4A000008
        # define INTSUBMSK 0x4A00001C
        # define CLKDIVN 0x4C000014
        # endif
        4、設置back初始化,設置cpu的工作頻率;
        #if defined(CONFIG_S3C2440)


        ldr r0, =CLKDIVN
        mov r1,#5
        str r1,[r0]

        mrc p15,0,r1,c1,c0,0
        orr r1, r1,#0xc0000000
        mcr p15,0,r1,c1,c0,0

        mov r1,#CLK_CTL_BASE
        mov r2,#MDIV_405
        add r2,r2,#PSDIV_405
        str r2,[r1,#0x4]
        #else



        ldr r0, =CLKDIVN
        mov r1, #3
        str r1, [r0]
        #endif
        adr r0, _start //adr是讀取地址的偽指令,表示將_start標示的運行地址給r0
        ldr r1, _TEXT_BASE // 表示將_TEXT_BASE 指向的地址中的數(shù)據(jù)拷貝到r1中
        cmp r0, r1 //比較是否相同
        beq stack_setup //相同跳轉(zhuǎn)出去


        ldr r2, _armboot_start //start起始地址,包含RO代碼段+RW 數(shù)據(jù)段+ZI全局變量
        ldr r3, _bss_start //全局變量的地址

        sub r2, r3, r2 //相減之后得到的是代碼段+數(shù)據(jù)段的總大小
        add r2, r0 r2, //r0是要燒錄的內(nèi)容,表示的是燒錄的代碼段+數(shù)據(jù)段的結(jié)束地址

        copy_loop:
        ldmia r0!, {r3-r10} //ldmia批量的拷貝,向后拷貝32位到r3-r10(將r0中的數(shù)據(jù)讀出到r3-r10的,r0自動加一)
        stmia r1!, {r3-r10} //stmia批量的存儲到r1上也就是目標運行的地址上(將r3-r10中的數(shù)據(jù)保存到r1指向的地址上,r1自動加一)
        cmp r0, r2 //r0 燒錄的起始地址,r2燒錄的結(jié)束地址,相等則說明拷貝完成
        ble copy_loop
        #endif
        6、設置建立堆棧;
        7、執(zhí)行內(nèi)存地址上的程序,該工作可以使ldr pc來完成;

        start.s是u-boot啟動所執(zhí)行的第一個文件,它說做的是設置系統(tǒng)堆棧和cpu的工作方式,為進入c程序奠定基礎(chǔ)。
        第二階段:用c語言完成,以實現(xiàn)更復雜的命令
        1、 調(diào)用系統(tǒng)一系列的初始化函數(shù);
        2、 初始化Flash設備;
        3、 初始化系統(tǒng)內(nèi)存分配函數(shù);
        4、 如果目標系統(tǒng)有NAND設備,則初始化NAND設備;
        5、 如果系統(tǒng)擁有顯示設備,則初始化該類設備;
        6、 初始化相關(guān)網(wǎng)絡設備,填寫IP、MAC地址等;
        7、 進去命令循環(huán)(即整個boot的工作循環(huán)),接收用戶從串口輸入的相關(guān)命令,然后進行相應的工作;


        關(guān)鍵詞: Bootloaderu-boot啟動模

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 德格县| 信宜市| 安庆市| 浏阳市| 林芝县| 长宁县| 镇平县| 吐鲁番市| 维西| 华安县| 宜都市| 长宁县| 绩溪县| 黄浦区| 巩留县| 禹城市| 淮滨县| 张家界市| 牙克石市| 肇州县| 青岛市| 石景山区| 阿拉善右旗| 运城市| 陵水| 开平市| 陵川县| 昌吉市| 建始县| 静宁县| 咸阳市| 敖汉旗| 巴塘县| 嘉义市| 清徐县| 四子王旗| 龙海市| 南丰县| 襄城县| 长岛县| 济宁市|