内核本身由一个作了raw_binary处理的目标文件(下文称为kernel.o)以及大量的在运动时可能被动态装载的内核模块构成。
关于内核映像的构成,可以参考http://blog.youkuaiyun.com/crazycoder8848/article/details/19156503
可以看到,start_kernel中的工作有:
命令行参数的设置setup_command_line
命令行参数的解析parse_early_param,parse_args
另外,还有一个比较特殊的地方是:
关于内核映像的构成,可以参考http://blog.youkuaiyun.com/crazycoder8848/article/details/19156503
本文仅谈一谈内核的启动流程,基于3.10.102版本的内核源码。
对32位x86而言,入口代码位于arch/x86/kernel/head_32.S中的ENTRY(startup_32)。这片代码在做完底层的相关配置后,便jmp到了C函数i386_start_kernel继续执行。i386_start_kernel中继续做一些cpu相关的初始化,最后调用与cpu架构无关的函数start_kernel,这就殊途同归的进入到了统一的内核初始化流程中。
可以看到,start_kernel中的工作有:
命令行参数的设置setup_command_line
命令行参数的解析parse_early_param,parse_args
另外,还有一个比较特殊的地方是:
在sched_init()执行完成后,此时的start_kernel对应的执行流,已经处于任务上下文中了,对应的task_struct为init_task(内核源码中能找到这样的定义DEFINE_PER_CPU(struct task_struct *,