注:本文是学习朱老师课程整理的笔记,基于linux2.6.35.7和九鼎X210BV3S开发板进行移植。
注:本文是学习朱老师课程整理的笔记,基于linux2.6.35.7和九鼎X210BV3S开发板进行移植。
内核启动入口
从顶层Makefile可以看到vmlinux的生成规则:
vmlinux image - including updated kernel symbolsvmlinux:
$(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o $(kallsyms.o) FORCE
其中$(vmlinux-lds)是链接脚本,对于ARM而言,就是arch/arm/kernel/vmlinux.lds文件(连接脚本并不是直接提供的,而是提供了一个汇编文件vmlinux.lds.S,然后在编译的时候再去编译这个汇编文件得到真正的链接脚本vmlinux.lds。)。从该脚本的如下内容可以看出,入口符号是stext:
SECTIONS
{
. = 0xC0000000 + 0x00008000;
.init : { /* Init code and data */
_stext = .;
_sinittext = .;
*(.head.text)
*(.init.text) *(.cpuinit.text) *(.meminit.text)
_einittext = .;
其中$(vmlinux-lds)是链接脚本,对于ARM而言,就是arch/arm/kernel/vmlinux.lds文件(连接脚本并不是直接提供的,而是提供了一个汇编文件vmlinux.lds.S,然后在编译的时候再去编译这个汇编文件得到真正的链接脚本vmlinux.lds。)。从该脚本的如下内容可以看出,入口符号是stext,在arch/arm/kernel/head.S中:
__HEAD
ENTRY(stext)
setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode
@ and irqs disabled
mrc p15, 0, r9, c0, c0 @ get processor id
bl __lookup_processor_type @ r5=procinfo r9=cpuid
movs r10, r5 @ invalid processor (r5=0)?
beq __error_p @ yes, error 'p'
bl __lookup_machine_type @ r5=machinfo
movs r8, r5 @ invalid machine (r5=0)?
beq __error_a @ yes, error 'a'
bl __vet_atags
bl __create_page_tables
……
ldr r13, __switch_data @ address to jump to after
@ mmu has been enabled
adr lr, BSYM(__enable_mmu) @ return (PIC) address
ARM( add pc, r10, #PROCINFO_INITFUNC )
THUMB( add r12, r10, #PROCINFO_INITFUNC )
THUMB( mov pc, r12 )
ENDPROC(stext)
- 第79行,确定内核运行在SVC模式下,并且关闭IRQ和FIQ中断,这样能保证内核启动过程不会被外部中断干扰。
- 第81-84行,确定处理器类型。
- 第85-87行,确定机器类型。
- 第88行,验证内核标记列表。
- 第89行,创建临时页表。
- 第98行,切换数据。
- 第100行,开启MMU。
- 第101行,调用特定平台的__cpu_flush函数。
- 最终跳转到C语言函数start_kernel()(在__switch_data结束时,调用“b start_kernel”)。
确定处理器类型
mrc p15, 0, r9, c0, c0 @ get processor id
bl __lookup_processor_type @ r5=procinfo r9=cpuid
movs r10, r5 @ invalid processor (r5=0)?
beq __error_p @ yes, error 'p'
__lookup_processor_type检验cpu id的合法性方法是:内核会维护一个本内核支持的CPU ID号码的数组,然后该函数所做的就是将从硬件中读取的cpu id号码和数组中存储的各个id号码依次对比,如果没有一个相等则不合法,如果有一个相等的则合法。将匹配到的proc_info_list的基地址存到r5中,0表示没有找到对应的processor type。
确定机器类型 bl __lookup_machine_type @ r5=machinfo
movs r8, r5 @ invalid machine (r5=0)?
beq __error_a
bl __lookup_machine_type @ r5=machinfo
movs r8, r5 @ invalid machine (r5=0)?
beq __error_a