1.在顶层MAKEFILE中,包含include $(srctree)/arch/$(ARCH)/Makefile
(此Makefile中head-y=arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o)
vmlinux-init := $(head-y) $(init-y)
vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
vmlinux-all := $(vmlinux-init) $(vmlinux-main)
vmlinux-lds := arch/$(ARCH)/kernel/vmlinux.lds
从以上,可以看出,内核首先执行的是head.S
2.第一阶段
从head.S到init/main.c中的start_kernel 执行过程
/*是否支持CPU、板子类型、建立一级页表*/
bl __lookup_processor_type
|
bl __lookup_machine_type
|
bl __create_page_tables
|
/*将__switch_data地址放入r13,以备使能MMU后,再调用*/
ldr r13, __switch_data
|
/*将__enable_mmu放入lr返回地址,以备使用*/
adr lr, __enable_mmu @ return (PIC) address
/*r10中保存的是__lookup_processor_type得到的__arm920_proc_info的地址
PROCINFO_INITFUNC 是此地址处的偏移。此时跳转到b __arm920_setup
*/
add pc, r10, #PROCINFO_INITFUNC
|
__arm920_setup
|
/*当在__arm920_setup中执行完最后一句mov pc, lr时,就跳到__enable_mmu中去执行了*/
|
__enable_mmu
/*__enable_mmu执行完最后一句mov pc, r13时,跳到__switch_data执行,__switch_data的第一个值是.long __mmap_switched,所以就去执行__mmap_switched */
|
__mmap_switched
|
/*__mmap_switched中最后一句b start_kernel,开始调用start_kernel,第一阶段完成*/
start_kernel
3.第二阶段 在start_kernel中的部分函数
printk(linux_banner);
setup_arch(&command_line);
console_init();
rest_init();
阅读(2003) | 评论(1) | 转发(0) |