操作系统之引导

来源:互联网 发布:淘宝导航怎么做 编辑:程序博客网 时间:2024/06/02 16:44

 要研究操作系统的第一步当然是实现引导,网上有很多文章都只说到了用软盘来实现,基本上是用一段C程序,把引导代码写进软盘的引导扇区里。

但现在哪里能找得到软驱阿,光驱倒可以试一下,有兴趣的朋友可以用光盘来实现引导,有好办法记得告诉我啊!

但如果这些物理因素都不具备的话,就要用到虚拟机——vmware了,本人是在WINDOWS下做的实验,win xp+vmware。

vmware能使用软盘的映像文件,也就是后缀名为img的文件,只要新建一个虚拟机,在setting那里的软驱项选择img文件就可以了,这个系统的启动就会从读这个img文件开始。(如果这个不懂,就学习一下怎么使用vmware吧)

但img文件的格式我不懂,网上也貌似没有相关的工具,让你把代码直接写到img文件的引导部分去。

既然没有工具,那我们就自己来吧,先了解一下img文件的格式,因为引导扇区是512个字节的,img文件应该和它有一定的对应关系。

下面是引导扇区的格式:

硬盘的第一个扇区,是主引导扇区,有时候叫做 MBR。

主引导扇区是一个数据结构,由以下三部分组成:

1、446 字节的程序代码(病毒最爱改写这里的代码);

2、64 字节的分区表;

3、2 字节的“幻数”,或者叫做“引导允许标志”。

前面 446 字节是程序。程序都是标准的,例如 DOS/WINDOWS引导程序,LINUX引导程序,

即使坏了,也不要紧,很容易获得这些程序的代码。

64 字节的分区表最要命! 千万不能改动(即破坏)了,它保存你的硬盘分区信息。坏了就不容易恢复了。

最末尾的两个字节也是不能改动的,它是允许引导的标志。 (0x55, 0xaa)

===============

所以,你只需要写 446 个字节就行了,写多了可危险!(覆盖掉 64 字节的分区表中的任何一部分,就完蛋了!)

建议你写盘操作之前,先把分区表备份到软盘,或者打印到纸上,以防万一。

备份到硬盘是没有用的,因为硬盘分区表一损坏,你的操作系统就不能进入了。

==============

写盘操作太危险,如果没有绝对的把握,不要盲干。 

 

看到512字节里最后两个字节了吧,0x55, 0xaa,那我们就用这个线索来分析img文件。

首先用ultraedit来打开img文件,如果没有img文件就用winimage或者什么其它的工具建一个,然后直接查找 "55 aa",查找的结果如下图,就在200h的上面。。。

img文件格式1

如果你算一下,就知道200h刚好是512,那就很清楚了,img文件的前512个字节就是磁盘里的引导扇区。那我们就只要把写好的代码的16进制(转为二进制就是机器码了)填在前面的512字节就可以了。。。


接着我们写一段汇编代码,这是引导后执行的第一段代码,把这个文件存为 myOS.asm,代码如下:

assume cs:code

data segment

data ends

stack segment

stack ends

code segment
start:
 ; 在第一行、第一列显示一个字符 'A'
 mov ax, 0b800h 
 mov es, ax
 mov al, 41h
 mov es:[0], al
 mov al, 2
 mov es:[1], al

loop1:
 jmp loop1 ; 无限循环

code ends

end start


用masm把这段代码编译成功就会产生一个exe文件,但这个exe文件不是完全对应的机器代码,masm 给它附带了很多信息,了解过PE文件的人应该知道。

我们的目的是要知道代码的16进制格式(转为二进制就是机器代码了),那我们就可以使用DEBUG程序反汇编,反汇编出来,马上就知道对应的16进制代码,如下图,左边的什么B800B8就是代码对应的16进制格式:

 

debug反汇编

 

那我们用 ultraedit 打开这个myOS.exe文件,查找一下这段16进制代码,如下图:

 

myOS.exe文件 

 

把这段查找到的代码复制到img文件的开头(注意字节数),如下图:

 

 

 拷贝代码至 IMG 文件

 

 

然后再保存img文件,我们的img文件就做好了。再用VMWARE把这个img文件load进来,启动虚拟机,那我们的系统就成功引导了,虽然什么都不干。图如下:

 

系统引导成功

 

 

 

下面再附上8086系统启动的一些资料:

 

 

计算机启动过程详解 


    打开电源启动机器几乎是电脑爱好者每天必做的事情,面对屏幕上出现的一幅幅启动画面,我们一点儿也不会感到陌生,但是,计算机在显示这些启动画面时都做了些什么工作呢?相信有的朋友还不是很清楚,本文就来介绍一下从打开电源到出现Windows的蓝天白云时,计算机到底都干了些什么事情。

    首先让我们来了解一些基本概念。第一个是大家非常熟悉的BIOS(基本输入输出系统),BIOS是直接与硬件打交道的底层代码,它为操作系统提供了控制硬件设备的基本功能。BIOS包括有系统BIOS(即常说的主板BIOS)、显卡BIOS和其它设备(例如IDE控制器、SCSI卡或网卡等)的BIOS,其中系统BIOS是本文要讨论的主角,因为计算机的启动过程正是在它的控制下进行的。BIOS一般被存放在ROM(只读存储芯片)之中,即使在关机或掉电以后,这些代码也不会消失。

    第二个基本概念是内存的地址,我们的机器中一般安装有32MB、64MB或128MB内存,这些内存的每一个字节都被赋予了一个地址,以便CPU访问内存。32MB的地址范围用十六进制数表示就是0~1FFFFFFH,其中0~FFFFFH的低端1MB内存非常特殊,因为最初的8086处理器能够访问的内存最大只有1MB,这1MB的低端640KB被称为基本内存,而A0000H~BFFFFH要保留给显示卡的显存使用,C0000H~FFFFFH则被保留给BIOS使用,其中系统BIOS一般占用了最后的64KB或更多一点的空间,显卡BIOS一般在C0000H~C7FFFH处,IDE控制器的BIOS在C8000H~CBFFFH处。

    好了,下面我们就来仔细看看计算机的启动过程吧。

    第一步:当我们按下电源开关时,电源就开始向主板和其它设备供电,此时电压还不太稳定,主板上的控制芯片组会向CPU发出并保持一个RESET(重置)信号,让CPU内部自动恢复到初始状态,但CPU在此刻不会马上执行指令。当芯片组检测到电源已经开始稳定供电了(当然从不稳定到稳定的过程只是一瞬间的事情),它便撤去RESET信号(如果是手工按下计算机面板上的Reset按钮来重启机器,那么松开该按钮时芯片组就会撤去RESET信号),CPU马上就从地址FFFF0H处开始执行指令,从前面的介绍可知,这个地址实际上在系统BIOS的地址范围内,无论是AwardBIOS还是AMIBIOS,放在这里的只是一条跳转指令,跳到系统BIOS中真正的启动代码处。

    第二步:系统BIOS的启动代码首先要做的事情就是进行POST(Power-OnSelfTest,加电后自检),POST的主要任务是检测系统中一些关键设备是否存在和能否正常工作,例如内存和显卡等设备。由于POST是最早进行的检测过程,此时显卡还没有初始化,如果系统BIOS在进行POST的过程中发现了一些致命错误,例如没有找到内存或者内存有问题(此时只会检查640K常规内存),那么系统BIOS就会直接控制喇叭发声来报告错误,声音的长短和次数代表了错误的类型。在正常情况下,POST过程进行得非常快,我们几乎无法感觉到它的存在,POST结束之后就会调用其它代码来进行更完整的硬件检测。

    第三步:接下来系统BIOS将查找显卡的BIOS,前面说过,存放显卡BIOS的ROM芯片的起始地址通常设在C0000H处,系统BIOS在这个地方找到显卡BIOS之后就调用它的初始化代码,由显卡BIOS来初始化显卡,此时多数显卡都会在屏幕上显示出一些初始化信息,介绍生产厂商、图形芯片类型等内容,不过这个画面几乎是一闪而过。系统BIOS接着会查找其它设备的BIOS程序,找到之后同样要调用这些BIOS内部的初始化代码来初始化相关的设备。

    第四步:查找完所有其它设备的BIOS之后,系统BIOS将显示出它自己的启动画面,其中包括有系统BIOS的类型、序列号和版本号等内容。

    第五步:接着系统BIOS将检测和显示CPU的类型和工作频率,然后开始测试所有的RAM,并同时在屏幕上显示内存测试的进度,我们可以在CMOS设置中自行决定使用简单耗时少或者详细耗时多的测试方式。

    第六步:内存测试通过之后,系统BIOS将开始检测系统中安装的一些标准硬件设备,包括硬盘、CD-ROM、串口、并口、软驱等设备,另外绝大多数较新版本的系统BIOS在这一过程中还要自动检测和设置内存的定时参数、硬盘参数和访问模式等。

    第七步:标准设备检测完毕后,系统BIOS内部的支持即插即用的代码将开始检测和配置系统中安装的即插即用设备,每找到一个设备之后,系统BIOS都会在屏幕上显示出设备的名称和型号等信息,同时为该设备分配中断、DMA通道和I/O端口等资源。

    第八步:到这一步为止,所有硬件都已经检测配置完毕了,多数系统BIOS会重新清屏并在屏幕上方显示出一个表格,其中概略地列出了系统中安装的各种标准硬件设备,以及它们使用的资源和一些相关工作参数。

    第九步:接下来系统BIOS将更新ESCD(ExtendedSystemConfigurationData,扩展系统配置数据)。ESCD是系统BIOS用来与操作系统交换硬件配置信息的一种手段,这些数据被存放在CMOS(一小块特殊的RAM,由主板上的电池来供电)之中。通常ESCD数据只在系统硬件配置发生改变后才会更新,所以不是每次启动机器时我们都能够看到“UpdateESCD…Success”这样的信息,不过,某些主板的系统BIOS在保存ESCD数据时使用了与Windows9x不相同的数据格式,于是Windows9x在它自己的启动过程中会把ESCD数据修改成自己的格式,但在下一次启动机器时,即使硬件配置没有发生改变,系统BIOS也会把ESCD的数据格式改回来,如此循环,将会导致在每次启动机器时,系统BIOS都要更新一遍ESCD,这就是为什么有些机器在每次启动时都会显示出相关信息的原因。

    第十步:ESCD更新完毕后,系统BIOS的启动代码将进行它的最后一项工作,即根据用户指定的启动顺序从软盘、硬盘或光驱启动。以从C盘启动为例,系统BIOS将读取并执行硬盘上的主引导记录,主引导记录接着从分区表中找到第一个活动分区,然后读取并执行这个活动分区的分区引导记录,而分区引导记录将负责读取并执行IO.SYS,这是DOS和Windows9x最基本的系统文件。Windows9x的IO.SYS首先要初始化一些重要的系统数据,然后就显示出我们熟悉的蓝天白云,在这幅画面之下,Windows将继续进行DOS部分和GUI(图形用户界面)部分的引导和初始化工作。

    如果系统之中安装有引导多种操作系统的工具软件,通常主引导记录将被替换成该软件的引导代码,这些代码将允许用户选择一种操作系统,然后读取并执行该操作系统的基本引导代码(DOS和Windows的基本引导代码就是分区引导记录)。上面介绍的便是计算机在打开电源开关(或按Reset键)进行冷启动时所要完成的各种初始化工作,如果我们在DOS下按Ctrl+Alt+Del组合键(或从Windows中选择重新启动计算机)来进行热启动,那么POST过程将被跳过去,直接从第三步开始,另外第五步的检测CPU和内存测试也不会再进行。我们可以看到,无论是冷启动还是热启动,系统BIOS都一次又一次地重复进行着这些我们平时并不太注意的事情,然而正是这些单调的硬件检测步骤为我们能够正常使用电脑提供了基础。