首页 理论教育深度解析Linux内核初始化框架

深度解析Linux内核初始化框架

【摘要】:内核初始化的主要任务则是加载并执行应用空间的初始化程序,由系统应用接管系统完成特定的功能,而Linux内核则开始为应用提供良好的服务。Linux内核初始化框架如图4-3所示。图4-3Linux内核初始化框架图4-3展示了Linux内核的初始化的基本流程,首先是与体系结构相关的head.o部分,然后跳入体系结构无关的代码start_ kernel,开始内核后续的初始化处理。

谈到内核初始化,首先要考虑到处理器的初始化过程。处理器上电后,内存(可以执行代码的设备)还没有初始化、没有处于正常的工作状态,也就不能直接执行代码。对于该问题,各种体系结构都会规定上电重启(通常为power on reset)的情况下,处理器执行第一条指令的地址,而具体的处理器厂商就将可执行代码存放在该地址处,使得处理器上电后能正常运行,通常这部分代码被叫做ROM Code。处理器首先执行ROMCode的代码,处理器中还有一部分存储空间即内部SRAM可以执行代码,但是SRAM通常都比较小,不能放下Linux内核的压缩image,这样就需要有个中间过渡的模块,该模块的主要功能是进行系统加载,叫做boot loader。当然根据具体的情况,boot loader也可以分级,最终boot loader会加载Linux内核的压缩image,并将参数传给Linux内核,跳转到Linux内核中让其自身初始化并执行。这个阶段的流程如图4-1所示。

978-7-111-49426-3-Chapter04-1.jpg

图4-1 处理器启动流程

图4-1引自《DM 3730芯片手册》中第3524页的流程图,虽然是DM 3730芯片手册中的图,但是该流程广泛适用于各种处理器。

Rom Code通常是由处理器厂商进行开发,而所谓的软件初始化是从boot loader开始的。整个软件系统初始化流程如图4-2所示。

978-7-111-49426-3-Chapter04-2.jpg

图4-2 系统初始化流程(www.chuimin.cn)

由图4-2可见,boot loader的主要工作包括两部分:其一,进行一些硬件的初始化,如内存以及一些必要设备的初始化;另外,boot loader还要获得Linux内核image并将其复制到内存中。但是注意boot loader能使用的资源比较有限,所以功能比较简单。内核初始化的主要任务则是加载并执行应用空间的初始化程序,由系统应用接管系统完成特定的功能,而Linux内核则开始为应用提供良好的服务。

Linux内核初始化框架如图4-3所示。

978-7-111-49426-3-Chapter04-3.jpg

图4-3 Linux内核初始化框架

图4-3展示了Linux内核的初始化的基本流程,首先是与体系结构相关的head.o部分,然后跳入体系结构无关的代码start_ kernel(这里已经进入虚拟地址执行),开始内核后续的初始化处理。其中会涉及很多模块的初始化,当然有些模块中包含体系结构相关以及板级相关的初始化操作。最终Linux内核会执行应用系统的初始化进程initprocess,从而真正地转入应用系统中,开始各种各样应用的操作。