arm linux内核启动大致流程

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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值