本文以Linux3.14版本源码为例分析其启动流程。各版本启动代码略有不同,但核心流程与思想万变不离其宗。
内核映像被加载到内存并获得控制权之后,内核启动流程开始。通常,内核映像以压缩形式存储,并不是一个可以执行的内核。因此,内核阶段的首要工作是自解压内核映像。
内核编译生成vmliunx后,通常会对其进行压缩,得到zImage(小内核,小于512KB)或bzImage(大内核,大于512KB)。在它们的头部嵌有解压缩程序。
通过linux/arch/arm/boot/compressed目录下的Makefile寻找到vmlinux文件的链接脚本(vmlinux.lds),从中查找系统启动入口函数。
$(obj)/vmlinux: $(obj)/vmlinux.lds ( o b j ) / (obj)/ (obj)/(HEAD) ( o b j ) / p i g g y . (obj)/piggy. (obj)/piggy.(suffix_y).o
$(addprefix $(obj)/, $(OBJS)) $(lib1funcs) $(ashldi3)
( b s w a p s d i 2 ) F O R C E @ (bswapsdi2) FORCE @ (bswapsdi2)FORCE@(check_for_multiple_zreladdr)
( c a l l i f c h a n g e d , l d ) @ (call if_changed,ld) @

本文详细分析了Linux3.14版本的内核启动流程,从内核映像加载到内存、自解压,再到处理器检查、MMU启用,直至start_kernel函数的执行,涵盖了内核引导和初始化阶段的关键步骤,包括设备信息存储、页地址初始化、控制台初始化等。最终,kernel_init函数创建第一个用户空间应用程序,标志着内核初始化结束。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



