Linux 版 (精华区)
发信人: tdx (汤大虾), 信区: Linux
标 题: 操作系统讲稿(汤大虾转载)2
发信站: 紫 丁 香 (Sun Feb 27 18:41:49 2000) WWW-POST
2.讲解
2.1 准备工作
必须先了解操作系统的启动流程,如下(硬盘)所示:
BIOS -- MASTERBLOCK -- FIRST STARTUP CODE(1SC)--SECOND STARTUP CODE(2SC) -
OS
0扇区 -- 引导分区逻辑0扇区 -- 位置相对比较任意
但是,应该认识到除了BIOS读入第一个扇区是硬性规定外,对一个操作系统而言其余的步骤
都只是约定,可以有很大发挥余地的,这也大概就是市场上一些多操作系统引导管理软件的
秘密所在.
下面是一个简陋的系统引导程序在硬盘分布的图,这里有四个分区,分区3上假设是要启动
的操作系统所在的分区,按照上面的引导流程,最终可以找到OS将它装入. 有人可能会奇怪
为什么要这么繁琐的过程,是否可以简化一下. 可是实际上每一步都是必要的:由于硬盘可
以分区,操作系统可以装载在其中任意一个分区上,为了使BIOS不满硬盘到处找,就有了
MASTERBLOCK ; MASTERBLOCK 中有一段程序(还有一个分区表)用于寻找要启动的分区,读
入操作系统所在分区的引导程序(逻辑0扇区),这就是1SC; 前面的好理解,但为什么这一步
不直接装入操作系统,还要在装入所谓的2SC呢? 因为1SC的大小受到限制-只是一个扇区大
小,即512字节,这点代码量连像MINIX这样微型的操作系统也是无法装入的,至于装入系统
要做那些工作请看2.2.3节.
- - - - - - - - - - - - - - - - - - -
|MASTERBLOCK| 分区1
|- - - - - - - - - - - - -- - - - - -
| 分区2
|- - - - - - - - - - - - - - - - - - -
| 1SC | | 2SC | |OS| 分区3
|- - - - - - - - - - - - - - - - - - -
| 分区4
- - - - - - - - - - - - - - - - - - -
需要作这样一些准备工作:
.引导程序的编写.
.在引导扇区写入自己的引导程序(MB,1SC).
.引导程序(MB,1SC)要能够找到系统需要加载的文件(2SC).
.另外,需要指出,MB和1SC都对大小有严格的限制:都是1个扇区(512BYTE)大小,因此此时代
码的简洁就非常重要,所以这两部分都是用汇编语言编写的.
为达到这些目的,minix 中做了这样一些工作:
.minix系统的image 文件制作.制作image文件目的是把整个操作系统打包在一起,方便查
找,装入.制作的方法也很简单,就是把操作系统的各个部分按照sector对齐连接起来.下图
是image文件的内容.图中,文件头就是可执行文件的文件头,其中包括可执行文件的各个段
(data , text ,stack)大小信息,这些信息用于在系统装入时,完成系统的初始化.
_______________
|Kernel 文件头 |
== == == == == =
|kernel |
== == == == == =
|fs 文件头 |
== == == == == =
|fs |
== == == == == =
|mm 文件头 |
== == == == == =
|mm |
== == == == == =
|init 文件头 |
== == == == == =
|init |
-- -- -- -- -- -
.把引导程序(1SC)写到启动设备的第一扇区,2SC在硬盘上的物理绝对地址被添入1SC中,
使得1SC可以最终把它读进来.
.如果需要,可以向0扇区(主引导扇区)中写入MINIX的主引导程序,以下的讲解假设minix主
引导写入了MBR.
2.2 BIOS引导
BIOS 引导,初始化中断向量,把rom中的程序拷贝到ram中(ram速度比rom快一些),初始化硬
件的配置信息.
之后,它读入主盘的0扇区->0:0x7c00(31k),跳转过去… …
(以下2.2.x节 大致上对应minix 系统中 /usr/src/boot 下的源程序,感兴趣者可以查阅
)
这时的内存分配情况:
0------1K-----1.5K----…----31K---31.5K-… …------------------640K-------1M
VECTOR BIOS 0扇区 ROM …
DATA
2.2.1 主引导(MB)执行的主要步骤
.初始化堆栈,段寄存器(0)
.拷贝自己-- 0:0x0600(0-0x0400 中断向量, 0x0400-0x600 BIOS数据,所以这里是最低的
可用内存区),转移过去;
.检查是否按下了ALT键,如果按下了,则可以输入要启动的分区号,没有按下接着下面的步
骤;
.检查是否有设置了固定启动分区( MINIX 自己定义的),有则启动此分区,否则执行下面的
步骤;
.查找第一个活动分区. 找不到活动分区就在下一个硬盘接着找,直到找到为止;
.如果以上某一步成功,最终1SC被读入0:0x7c00.
这时的内存分配情况:
0------1K-----1.5K----2K-…----31K----31.5K… …-----------------640K-------1M
VECTOR BIOS 0扇区 1SC ROM …
DATA
2.2.2 1SC
.初始化段寄存器,堆栈;
.从MB中得到启动分区的扇区号;
.装入2SC(它在硬盘上的地址是在准备工作时填入的,1byte count+3byte address);
.跳转到(2SC,HEADER)
这里需要注意,MB和1SC都是去掉可执行文件头写到指定扇区的,可2SC是可行文件带有文件
头,因此要跳过头文件,用(2SC,HEADER)表示.
这时的内存分配情况:
0------1K-----1.5K----2K-……--31K----31.5K… …--64K---128K-……
-640K------1M
VECTOR BIOS 0扇区 1SC 2SC ROM …
DATA
--
※ 来源:·紫 丁 香 bbs.hit.edu.cn·[FROM: 166.111.11.176]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.402毫秒