以2.6.19内核为版别.
1. Boot loader在跳转到kernel之前,有必要完结
(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.