启动 Boot

硬件系统加电 Reset 后,正常情况下 CPU 会执行物理内存地址 FFFFFFF0h 处的指令。根据 x86 的设计,这个地址位于 BIOS 程序中。FFFFFFF0h 处指令通常是 jump 跳转,跳到 BIOS 自检程序。BIOS 完成一系列系统自身的检查和初始化工作成功后,根据用户预设的启动映象进行操作。
对于启动磁盘设备为软盘时,BIOS 读取磁盘的第一个扇区,即零扇区(磁道(柱面) 0,磁头 0,扇区 1(从 1 开始计算)),加载到物理内存 00007C00h 处,然后跳转执行代码。
这段代码就是操作系统 OS 意义上的启动 Boot 代码。
启动代码的任务主要是检查硬件系统,载入操作系统内核代码,并执行。另外,根据实现的不同启动代码也会做一些其他有关联的杂务(比如设置系统状态模式)。
根据 x86 特性,无论系统是 386 486 还是 PI PII PIII PIV 等等,这时的系统都是 16 位实模式,而不是正常的 32 位保护模式,无论利用系统的全部功能。
但是,BIOS 子程序是实模式调用的,可以利用 BIOS 功能完成繁琐的显示、读磁盘的操作。常用 BIOS 调用有:
◎在当前位置显示一个字符 int 10h 功能号 AH 0Eh 显示的字符 AL 页号 BH 7
◎从键盘缓冲读按键 int 16h 功能号 AH 00h 返回字符 AL
◎读磁盘扇区 int 13h 功能号 AH 02h 读取数 AL 磁头号 DH 驱动器号 DL 磁道/扇区 CX(6-15/0-5) 返回到缓冲 ES:BX 成功 CF=0 AH=0 实际读取扇区数 AL
◎系统重启 int 19h
一般来说启动扇区还包含有磁盘文件系统信息,详细内容参阅文件系统相关内容(fat12)。同时,要载入的内核文件页可能与文件系统有关而特定存放。这样,在启动扇区代码组织上和读取内核文件上必须根据文件系统的要求而调整。
对于 fat12 文件系统,内核文件位于文件系统根目录。简要的操作如下:
1、查询文件系统信息,定位根目录项目、FAT 表、数据簇所在的扇区、大小;
2、读取根目录项目扇区到缓冲,查找内核文件名,否则出错退出;
3、根据找到的内核文件目录项确定文件簇;
4、读 FAT 文件分配表到缓冲;
5、读文件簇(转换扇区)到内核内存块;
6、根据当前簇在 FAT 表查找下一簇,重复 5 知道文件簇结束;
7、读内核文件结束后跳转到内核地址,执行。
跳转通常会使用 pop 将地址段和偏移入栈,使用返回指令 retf 来实现跳转。
另:boot 也许做一些杂务,比如切换系统实模式到保护模式(参阅其他文档),这时由于系统模式的改变,寻址方式有异,跳转会其他特别的方法。

发表评论

%d 博主赞过: