arm linux内核启动大致流程

本文详细解析了Linux内核的启动过程,包括从MAKEFILE的构建规则到head.S的执行,再到start_kernel函数的调用等关键步骤,并介绍了设置处理器类型、创建页表等重要操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值