<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

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

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

(1). CPU必須處于SVC(supervisor)模式,并且IRQ和FIQ中斷都是禁止的;
(2). MMU(內存管理單元)必須是關(guān)閉的, 此時(shí)虛擬地址對物理地址;
(3). 數據cache(Data cache)必須是關(guān)閉的
(4). 指令cache(Instruction cache)可以是打開(kāi)的,也可以是關(guān)閉的,這個(gè)沒(méi)有強制要求;
(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,用來(lái)描述設備信息屬性的列表,詳細內容可參考"Booting ARM Linux"文檔).

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

宏 位置 默認值 說(shuō)明
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 平臺相關(guān) RAM的起始物理地址

3. 代碼分析

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

在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中斷已經(jīng)關(guān)閉,這樣做是很謹慎的.

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

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

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



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

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>