http://www.ibm.com/developerworks/cn/linux/l-linuxboot/
LINUX启动流程
当 bzImage(用于 i386 映像)被调用时,我们从 ./arch/i386/boot/head.S
的 start
汇编例程开始执行(主要流程图请参看图 3)。这个例程会执行一些基本的硬件设置,并调用./arch/i386/boot/compressed/head.S
中的 startup_32
例程。此例程会设置一个基本的环境(堆栈等),并清除 Block Started by Symbol(BSS)。然后调用一个叫做decompress_kernel
的 C 函数(在 ./arch/i386/boot/compressed/misc.c
中)来解压内核。当内核被解压到内存中之后,就可以调用它了。这是另外一个 startup_32
函数,但是这个函数在 ./arch/i386/kernel/head.S
中。
在这个新的 startup_32
函数(也称为清除程序或进程 0)中,会对页表进行初始化,并启用内存分页功能。然后会为任何可选的浮点单元(FPU)检测 CPU 的类型,并将其存储起来供以后使用。然后调用 start_kernel
函数(在 init/main.c
中),它会将您带入与体系结构无关的 Linux 内核部分。实际上,这就是 Linux 内核的 main
函数。