//...根据grub内核映像所在路径,读取内核映像,并进行解压缩操作。并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立

   1.start_kernel(init/main.c)中调用一系列初始化函数:

   (1) 在屏幕上打印出当前的内核版本信息。

  (2) 执行setup_arch(),对系统结构进行设置。

  (3)执行sched_init(),对系统的调度机制进行初始化。先是对每个可用CPU上的runqueque进行初始化;然后初始化0号进程(其task struct和系统空M堆栈在startup_32()中己经被分配)为系统idle进程,即系统空闲时占据CPU的进程。

  (4)执行parse_early_param()和parsees_args()解析系统启动参数。

  (5)执行trap_in itQ,先设置了系统中断向量表。0-19号的陷阱门用于CPU异常处理;然后初始化系统调用向量;最后调用cpu_init()完善对CPU的初始化,用于支持进程调度机制,包括设定标志位寄存器、任务寄存器、初始化程序调试相关寄存器等等。

  (6)执行rcu_init(),初始化系统中的Read-Copy Update互斥机制。

  (7)执行init_IRQ()函数,初始化用于外设的中断,完成对IDT的最终初始化过程。

  (8)执行init_timers(), softirq_init()和time_init()函数,分别初始系统的定时器机制,软中断机制以及系统日期和时间。

  (9)执行mem_init()函数,初始化物理内存页面的page数据结构描述符,完成对物理内存管理机制的创建。

  (10)执行kmem_cache_init(),完成对通用slab缓冲区管理机制的初始化工作。

  (11)执行fork_init(),计算出当前系统的物理内存容量能够允许创建的进程(线程)数量。

  (12)执行proc_caches_init() , bufer_init(), unnamed_dev_init() ,vfs_caches_init(),signals_init()等函数对各种管理机制建立起专用的slab缓冲区队列。

  (13 )执行proc_root_init()Wl数,对虚拟文件系统/proc进行初始化。

   //...

   在 start_kenrel()的最后,通过kenrel_thread()创建出第一个系统内核线程(即1号进程),该线程执行的是内核中的init()函数,负责的是下一阶段的启动。

   2. init()函数作为核心线程,首先锁定内核(仅对SMP机器有效),调用populate_rootfs()加载initrd,然后调用 do_basic_setup()完成外设及其驱动程序的加载和分级初始化。init()打开/dev/console设备,重定向stdin、stdout和stderr到控制台,最后,搜索文件系统中的init程序(或者由init=命令行参数指定的程序),并使用 execve()系统调用加载执行init程序。

   3. 执行init进程的,相关/etc/rc.d/ 脚本等,执行/bin/login程序,进入登录状态