os学习笔记二(x86的启动加载和分区)

来源:互联网 发布:天刀千恩捏脸数据库 编辑:程序博客网 时间:2024/05/16 14:41

这也是一个翻译的文章,出处是http://www.nondot.org/sabre/os/files/Booting/x86Bootstrapping.html

值得注意的:
    下面说到的NetBSD的知识可能已经过时了,因为大概在NetBSD-1.3的时候就已经修改成为由一个block-list来装载次要的bootstrap(站了一晚说:http://www.douzhe.com/project/fbsd2/7.htm 这里解释到:启动一个计算机和加载操作系统的过程通常被叫做“bootstrap process”
或简单地叫“booting”。)和单独的库文件(libsa), 并且由另外的程序(installboot)来完成设置.

前言:
    这篇文章将尽力讲述分区,启动顺序和Intel 80x86平台上面的进行这些管理的程序.可能从一个简单的例子开始讲解是最简单的阐述分区和启动顺序的方法,并且适当地逐渐地加上一些复杂的东西.我们将会从一个单操作系统的配置开始,并且会逐渐引入复杂的例子.作者对由文章导致的损坏不负担任何责任,因为作者的目的只是为大家提供参考.
    我正在尝试写一个统一的系列文档,读起来就像是你自己的冒险书,因为你可以看到电脑是如何找到它的目标分区的.请告诉你对我这个主意的看法.我可能为了防止枯燥会在文章中不断地提供常见的例子.
    虽然我认为我也应该像正常人一样把这些写在前面,但是这里的确不是一个FAQ.同时这样也会导致非常糟糕的文章结构.

处理器的启动步骤:
    Intel x86系列的处理器是从硬件的reset开始的,初始化所有的cache,register和buffer把其中的值设置为所需要的值.很快转为实模式.EIP被设置为0000FFF0H,CS作为段选择器指向基址FFFF0000H.因为程序的执行由FFFFFFF0H开始(CS:EIP)----即距物理内存(EPROM)顶部60bytes处.这个EPROM通常被用到的是低端的地址,但是会被系统的一些芯片给重新映射到高端地址(比如Intel 430HX).值得注意的是,这里选择子/基址的对应关系同实模式下面编程时的对应关系是不一样的.通常,PC中的这个EPROM将会设置一个实模式下面的IDT并且跳到BIOS去执行.

单操作系统,单磁盘:
    最简单的配置是在单磁盘环境下面的单操作系统,比如,你可能在你唯一的SCSI磁盘上面只装了一个NetBSD(你用的难道不是SCSI?).
启动步骤:
1.BIOS装载器产生一个0x19的中断,这个中断通常是把软驱或者硬盘的第一个扇区(CHS<Cylinder Header Sector>的0:0:1地址)装载到0000:7C00.在这个例子里面,第一个扇区是首要的bootstrap loader.
   BIOS检查这个扇区的最后两个byte是否是AA55H(站了一晚说:见学习笔记一),如果不是的话,你可能会得到一个BIOS相关的信息(比如说非系统盘或者非启动盘)或者系统会被挂起.
2.首要的bootstrap loader主要任务之一是装载二级的bootstrap loader.首要bootstrap loader的代码是在/usr/mdec/??boot,在这里是在/usr/mdec/sdboot.这是由某个目录里面的代码产生的,在这里是/sys/arch/i386/boot/.
   首要bootstrap loader检查磁盘的第一个扇区并且查看称之为硬盘分区表(hard partition table)的东西.它会检查一个分区里面系统的硬盘分区表的system id是否为165
   它会读入这个NetBSD的硬盘分区的第一到第十四个扇区.在这里,它会读取0:0:1到0:0:14.它会把这些数据(包括它自己和二级bootstrap loader)一齐读进0000:1000H (FreeBSD和Mach会读到更高的地址段).选择这里是因为最底端的4k被用做BIOS的临时暂存区域(scratch area).
   如果没有次要bootstrap loader 你可能会看到NetBSD返回的下面的出错信息:"没有可启动的分区"或者"读取错误".
   假如一切都正常的话,执行会跳到刚才装载了代码的位置执行----即二级bootstrap loader.
3.NetBSD的二级bootstrap loader可以通过它本身提供的提示来辨识.它由/usr/mdec/??boot来实现,在这里是/usr/mdec/sdboot
   典型的提示如下:
>> NetBSD BOOT: xxxx/yyyy k []
use hd(1,a)/netbsd to boot sd0 when wd0 is also installed
Boot: [[[sd(0,a)]/netbsd][-adrs] :-
   (土星语:这段不清楚,干脆不翻了,以后再说,谁知道的帮忙翻一下)The NetBSD secondary bootstrap is designed to load the kernel. It has no device drivers, so that means you'll have to boot off stuff your BIOS 
recognizes (i.e. the first two drives). The stuff about hd is only relevant if you have both SCSI and IDE controllers in your machine, and is a kluge to 
compensate for the way the BIOS works.
   Bootstrap寻找你选择的内核.然后内核就能把装进内存里面.因为内核可能大于512k或者640k,这样二级bootstrap必须在实模式(可以调用BIOS的功能)和保护模式(可以访问更多内存)之间切换.当你选择了一个驱动器的时候,或者某个驱动器本身就被设置为了默认启动以后,它就会从驱动器的标签中读取分区表.这样的描述实际上掩盖了许多小细节,后面我会详细的叙述的.假设已经设置为默认的了,让我们接着说启动sd(0,a)/netbsd文件.
   和首要bootstrap的机制一样,二级bootstrap会在sd0上面寻找一个具有NetBSD系统id的硬盘分区,然后寻找此硬盘分区的标签,这里保存了一个内嵌的Unix分区表.
   Unix分区表不过是一个"分区"的列表(在FreeBSD中称为slice,但实际上是同一个东西)和每个分区的地址范围.它会寻找Unix的a分区(就是sd(0,a)中的a)并且寻找这个分区的开始位置,然后在文件系统的根目录寻找netbsd文件(根据leading slash<这是什么?土星也不知道>

原创粉丝点击