从开机加电到执行main函数之前的过程(一)

来源:互联网 发布:淘宝汽车凹陷修复工具 编辑:程序博客网 时间:2024/04/30 17:47

我们平时将计算机打开,要经过几十秒,才能进入到我们熟悉的图形(命令行)界面。那么,在这几十秒之内,计算机在干什么呢?计算机做了那些事情呢?下面让我们一探究竟。  

    从开机到main()的执行分三步完成,其目的是实现从启动盘加载操作系统程序,完成执行main()所需要的准备工作

  1. 启动BIOS,准备实模式下的中断向量表和中断服务程序;
  2. 从启动盘加载操作系统到内存,加载操作系统程序的工作就是利用第一步中准备的中断服务程序实现的;
  3. 为执行32位的main()做过渡工作。

注:实模式(Real Mode)是Intel 80286和之后的80x86兼容的CPU的操作模式。实模式的特性是一个20位的存储器地址空间(即1MB的存储器可被寻址),可以直接通过软件的方式访问BIOS以及周边硬件,没有硬件支持的分页机制和实时多任务的概念。

    下面,我们就来说说第一步--启动BIOS,准备实模式下的中断向量表和中断服务程序。

    我们都知道计算机加电的一瞬间,内存中什么程序都没有。软盘(硬盘)里虽然有操作系统程序,但CPU的逻辑电路被设计为只能运行内存中的程序,它没有能力直接从软盘(硬盘)运行操作系统。也就是说,我们现在的任务是将软盘(硬盘)中的操作系统程序加载到内存中,以使其可以执行。

    问题是内存中什么也没有,加载操作系统的过程由谁来完成呢?答案是BIOS

    我们先来说说BIOS自身是怎样启动的。前面说过,内存中什么都没有,所以软件启动BIOS的方法是不行的,那就只能靠硬件方法来完成了。

    为了兼容8086,以及解决最开始的启动问题,Intel做了两件事来完成这项工作。

  • Intel将所有80x86系列的CPU的硬件都设计为加电即进入16位实模式状态运行。等启动结束后,会切换到保护模式下。
  • 将CPU硬件逻辑设计为加电瞬间强行将CS的值置为0xFFFF,IP的值置为0x0000,这样CS:IP就指向了0xFFFF0这个地址范围,即BIOS的地址范围。
  •  
                                                     启动BIOS在内存中的状态及初始执行位置

    这是一个纯硬件完成的动作
。如果这里有可执行代码,那么计算机将从这里的代码开始,沿着后续的程序一直执行下去;否则,就此死机。
    BIOS程序的入口地址恰恰就是0xFFFF0。即BIOS程序的第一条指令就设计在这个位置上。

注:BIOS(Basic Input Output System),直译过来后中文名称就是"基本输入输出系统"。其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。

    从上图可以看到,我们选用的BIOS所占的地址段为0xFE000~0xFFFFF,大小为8KB。现在CS:IP已经指向0xFFFF0这个位置,BIOS就此可以启动了。BIOS会执行开机后的自检程序,这期间,有一项对启动操作系统直观重要的工作,那就是在内存中建立中断向量表和中断服务程序。
    
    
                                  BIOS在内存中加载中断向量表和中断服务程序

    从图中可以看到,BIOS程序在内存最开始的位置(物理地址0x00000),占用1KB的内存空间(0x00000~0x003FF)构建中断向量表,并在紧挨着它的位置用256字节的内存空间构建BIOS数据区(0x00400~0x004FF),在大约56KB以后的位置(0x0E2CE)加载了8KB左右的与中断向量表相应的若干中断服务程序。
  

本文参考自《Linux内核设计的艺术》,图片是从网上找的。
原创粉丝点击