Chinaunix首页 | 论坛 | 博客
  • 博客访问: 161567
  • 博文数量: 8
  • 博客积分: 2535
  • 博客等级: 少校
  • 技术积分: 765
  • 用 户 组: 普通用户
  • 注册时间: 2005-06-20 16:33
文章分类

全部博文(8)

文章存档

2012年(1)

2011年(1)

2010年(1)

2009年(5)

我的朋友

分类:

2010-02-24 11:39:20

Linux系统启动过程比较复杂,概括描述起来主要分三步:

第一步:硬件自检 
       当机器加电后它首先执行BIOS(基本输入输出系统)中的代码,BIOS首先执行加电自检程序(POST),
 当自检通过后便完成了硬件的启动。
POST程序通过对内存及其他硬件的设备的诊断检测确定硬件的存在并可正确操作。
 当自检完成后BIOS按照系统COMS中设置的启动顺序搜寻有效的启动驱动器(这里我们以硬盘为例),
 并读入系统引导扇区,并将系统控制权交给引导程序。

第二步:加载和执行引导程序

        在系统完成加电自检后,BIOS从启动盘中将引导扇区读入到内存中。在引导扇区被读入内存后,
BIOS就能从这里读取到启动盘的物理参数。引导记录开头是一条无条件转移指令,它将立即跳转到地址0x03e
执行引导程序(引导程序主要是把系统内核装载到内存),在引导扇区中这个引导程序将从磁盘中读出其他
几个更为复杂的程序并由它们加载系统内核。
【引导程序】
   Linux的引导程序由汇编代码文件arch/i386/boot/bootsect.S生成,它利用对BIOS功能的调用将
arch/i386/boot/下的setup.S文件和内核映象加载到内存。
   i386的体系结构的CPU分保护模式和实模式两种,在实模式下只能使用低端的640K内存(加载大于这个size
的内核映像文件时,需要调用其他程序进行分割分批的进行处理)。
系统在加载引导程序时CPU是处在实模式下,当把内核映像加载完毕后系统跳转到setup.S的开始位置开始执行,
setup.S仍在实模式下运行,主要功能是设置系统参数 (如:内存、磁盘等),并为进入保护模式做准备,最后
进入到保护模式并跳转到内核映象文件的头部开始执行内核。
注:如果通过GRUB或LILO(一般存放在MBR主引导记录中)进行引导时,选择了Linux OS启动时,首先跳转到
setup.S程序,根据相应的配置文件,找到相应的内核映像文件。

第三步:内核初始化
   
        当setup.S执行完后,CPU进行保护模式,并开始执行内核,如果内核是经过压缩的,那么首先执行
arch/i386/boot/compressed目录下的head.S建立堆栈并解压内核映象文件,然后再转入arch/i386/kernel
下的 head.S。如果没有压缩则直接转到head.S开始执行。
【head.S程序】
   负责数据区(BBS)、中断描述表(IDT)、段描述表(GDT)、页表和寄存器的初始化。最后进入start_kernel()
模块。此时系统运行在内核模式(0级别)下,转入到init/main.c中的start_kernel()。
【start_kernel()初始化】
   主要是初始化系统的核心数据结构,主要包括:
   setup_arch():执行与体系结构相关的设置。
   trap_init():设置各种入口地址。
   init_IRQ():初始化IRQ中断处理机制。
   sched_init():设置并启动第一个进程init_task()。
   softirq_init():对软中断子系统进行初始化。
   console_init():初始化控制台、显示器.
   init_modules():初始化kernel_module。
   fork_init():定义系统最大进程数.
   最后进入rest_init()函数并调用kernel_thread()创建init内核线程,进行系统配置。
【init内核线程】
   init内核线程占用进程描述表的第一项,由它来创建其他完成系统初始化的进程。
   调用do_basic_setup()来初始化外部设备及加载驱动程序。
     【do_basic_setup()】
      PCI总线初始化;
      网络初始化
      文件系统初始化。
      加载文件系统。
   用系统调用execve来执行用户态程序/sbin/init
   linux的内核初始化工作完成。

用户态程序/sbin/init的工作:
  读取/etc/inittab文件来决定具体的操作;
  si:sysinit:/etc/rc.d/rc.sysinit
  执行/etc/rc.d/rc.sysinit的脚本。
  rc.sysinit主要的工作是激活交换分区、检查磁盘、加载硬件模块。
  1:2345:respawn:/sbin/mingetty tty1 显示登录界面
至此,整个系统的引导过程就完成了。
阅读(594) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~