新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM Linux從入口到Start_kernel代碼分析 - (1)

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

        作者: 時間:2016-11-10 來源:網絡 收藏
        以2.6.19內核為版本.

        1. Boot loader在跳轉到kernel之前,必須完成

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

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

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

        2. 幾個重要的宏

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

        3. 代碼分析

        下面我們將arm linux boot的主要代碼列出來進行一個概括的介紹,然后,我們會逐個的進行詳細的講解.

        在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運行在SVC模式下,并且IRQ和FIRQ中斷已經關閉,這樣做是很謹慎的.

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

        最終跳轉到start_kernel (在__switch_data的結束的時候,調用了 b start_kernel)

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



        關鍵詞: ARMLinux代碼分

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 常德市| 师宗县| 中卫市| 贺州市| 陇西县| 南岸区| 抚顺市| 江安县| 南汇区| 镇巴县| 承德县| 南丹县| 苍溪县| 岫岩| 达尔| 万荣县| 黔南| 车险| 元朗区| 贵港市| 年辖:市辖区| 庆元县| 天镇县| 西盟| 息烽县| 高安市| 泰州市| 南华县| 苍山县| 嘉峪关市| 遂溪县| 乌审旗| 汶上县| 桐梓县| 河曲县| 大田县| 石屏县| 民和| 开原市| 都昌县| 郑州市|