在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM Linux從入口到Start_kernel代碼分析 - (1)

            ARM Linux從入口到Start_kernel代碼分析 - (1)

            作者: 時(shí)間:2016-11-10 來源:網(wǎng)絡(luò) 收藏
            以2.6.19內(nèi)核為版本.

            1. Boot loader在跳轉(zhuǎn)到kernel之前,必須完成

            本文引用地址:http://www.biyoush.com/article/201611/317213.htm

            (1). CPU必須處于SVC(supervisor)模式,并且IRQ和FIQ中斷都是禁止的;
            (2). MMU(內(nèi)存管理單元)必須是關(guān)閉的, 此時(shí)虛擬地址對物理地址;
            (3). 數(shù)據(jù)cache(Data cache)必須是關(guān)閉的
            (4). 指令cache(Instruction cache)可以是打開的,也可以是關(guān)閉的,這個(gè)沒有強(qiáng)制要求;
            (5). CPU 通用寄存器0 (r0)必須是 0;
            (6). CPU 通用寄存器1 (r1)必須是 ARM Linux machine type (關(guān)于machine type, 我們后面會(huì)有講解)
            (7). CPU 通用寄存器2 (r2) 必須是 kernel parameter list 的物理地址

            (parameter list 是由boot loader傳遞給kernel,用來描述設(shè)備信息屬性的列表,詳細(xì)內(nèi)容可參考"Booting ARM Linux"文檔).

            2. 幾個(gè)重要的宏

            宏 位置 默認(rèn)值 說明
            KERNEL_RAM_ADDR arch/arm/kernel/head.S +26 0xc0008000 kernel在RAM中的的虛擬地址
            PAGE_OFFSETinclude/asm-arm/memeory.h +50 0xc0000000 內(nèi)核空間的起始虛擬地址
            TEXT_OFFSET arch/arm/Makefile +137 0x00008000 內(nèi)核相對于存儲(chǔ)空間的偏移
            TEXTADDR arch/arm/kernel/head.S +49 0xc0008000 kernel的起始虛擬地址
            PHYS_OFFSETinclude/asm-arm/arch-xxx/memory.h 平臺(tái)相關(guān) RAM的起始物理地址

            3. 代碼分析

            下面我們將arm linux boot的主要代碼列出來進(jìn)行一個(gè)概括的介紹,然后,我們會(huì)逐個(gè)的進(jìn)行詳細(xì)的講解.

            在arch/arm/kernel/head.S中 72 - 94 行,是arm linux boot的主代碼:

            00072: ENTRY(stext)
            00073: msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode
            00074: @ and irqs disabled
            00075: mrc p15, 0, r9, c0, c0 @get processor id
            00076: bl __lookup_processor_type @ r5=procinfo r9=cpuid
            00077: movs r10, r5 @ invalid processor (r5=0)?
            00078: beq __error_p @ yes, error p
            00079: bl __lookup_machine_type@ r5=machinfo
            00080: movs r8, r5 @ invalid machine (r5=0)?
            00081: beq __error_a @ yes, error a
            00082: bl __create_page_tables
            00083:
            00084:
            00091: ldr r13, __switch_data @ address to jump to after
            00092: @ mmu has been enabled
            00093: adr lr, __enable_mmu @ return (PIC) address
            00094: add pc, r10, #PROCINFO_INITFUNC
            其中,73行是確保kernel運(yùn)行在SVC模式下,并且IRQ和FIRQ中斷已經(jīng)關(guān)閉,這樣做是很謹(jǐn)慎的.

            arm linux boot的主線可以概括為以下幾個(gè)步驟:
            1. 確定 processor type (75 - 78行)
            2. 確定 machine type (79 - 81行)
            3. 創(chuàng)建頁表 (82行)
            4. 調(diào)用平臺(tái)特定的__cpu_flush函數(shù) (在struct proc_info_list中) (94 行)
            5. 開啟mmu (93行)
            6. 切換數(shù)據(jù) (91行)

            最終跳轉(zhuǎn)到start_kernel (在__switch_data的結(jié)束的時(shí)候,調(diào)用了 b start_kernel)

            下面,我們按照這個(gè)主線,逐步的分析Code.



            關(guān)鍵詞: ARMLinux代碼分

            評論


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

            關(guān)閉