`
lobin
  • 浏览: 417385 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于os的一些整理:第二篇:2、主引导程序

 
阅读更多

引导程序不只是操作系统才有的,在分区文件系统中,也有引导程序用于引导该分区下的文件系统,例如在FAT文件系统中,每个FAT分区下都有一段引导程序。

 

引导程序还有多级引导。

 

主引导程序

主引导程序就是一段程序,在系统上电后由BIOS加载到内存进行执行,通常加载到0x7C00这个位置。主引导程序只有512字节,只占用1个扇区,存放在磁盘的第一个扇区,也就是MBR扇区。

 

主引导程序通常是一段汇编代码。

 

主引导程序可以用C开发吗?

 

可以的。

 

主引导程序是用来引导加载执行操作系统或内核的,或者像之前在内核程序那一篇文章中那样,另外有一个内核加载程序负责加载执行,引导程序只负责简单的引导,或者有一个独立的系统内核引导,如我们在另一篇文章中提到的Boot Manager,整个系统内核都由Boot Manager负责引导加载执行,但不管怎么样,我们这里只关注加载执行。这里我们联想到我们在点击软件运行的时候,程序也需要加载到内存开始运行,不同的是程序是由系统负责加载并运行的,加载运行的是程序,而我们这里其实跟这个原理是一样的,不同的是,我们要加载运行的是操作系统或内核,而负责加载运行的是主引导程序。

 

既然主引导程序是负责引导加载执行操作系统或内核的,那么主引导程序应该将系统或内核加载到内存的哪个位置去执行?普通程序的加载运行的时候,程序是不需要关心到底加载内存的哪个位置执行的,这个是由系统负责为程序加载分配一块安全的内存空间去执行的。另外,也并不是随便哪个内存位置都适合加载执行系统内核,这样很不安全。应该选择一个安全的内存位置区间来加载执行内核。到底哪些内存位置区间可以用来安全的加载系统内核并执行呢?

 

如果只是简单的实现一个主引导程序,可以简单的定义几个常量指定系统内核加载的位置。如下:

#define kernel 0x7e00
//#define kernel_segment 0x900
#define kernel_segment 0x7e0
#define kernel_offset 0x0000
#include "asm/kernel.h"

 

	k_kernel = kernel
	k_seg = kernel_segment
	k_offset = kernel_offset

但这样定死也太不灵活了。引导程序需要通过这几个常量将系统内核加载到指定内存位置并执行。在进入保护模式的时候,内核也需要通过这几个常量初始化内核在保护模式下运行的各个段,如代码段、数据段、堆栈段等,也就是各个段的描述符,以便加载描述符表。另外,如果内核程序只是简单的纯二进制镜像的话,还简单,但如果内核程序是EXE,PE或者ELF等其他复杂格式的镜像的话,还需要解析内核程序结构,根据各个段的所处位置初始化各个段,以便加载描述符表。

 

另外,引导程序和内核本质上是两个独立的程序,可能两个程序独立发布,或者我们只去编写内核程序,而使用第三方的引导程序引导加载,比如uboot等。如果像上面那样定死肯定是不行的。

 

引导方式

操作系统启动的时候,通常都是从硬盘引导。

当然,也可以选择其他引导方式,如通过光盘(以前在安装操作系统的时候,会有张安装盘,操作系统及安装程序刻录在光盘上,这个时候会选择光盘安装,通过光盘引导进行安装,安装完后在使用硬盘引导启动操作系统,以后每次启动系统的时候都是从硬盘引导启动),软盘,USB,移动硬盘引导,或者网络方式引导。

 

从BIOS执行跳转到主引导程序执行后,可以通过检查%DL来判断是通过什么方式引导的,是从软盘引导还是从硬盘引导。如果%DL=0x00,表示是从软盘引导,如果%DL=0x80,表示是从硬盘引导。

 

主引导程序加载执行

 

主引导程序

如果是磁盘操作系统,主引导程序存在磁盘的第一个扇区中,也就是MBR扇区。一般将MBR扇区称为启动扇区。

 

硬盘扇区为512字节,所以主引导程序大小仅能也只能512字节。

 

这里所说的磁盘操作系统指的是通过磁盘引导启动操作系统。

 

MBR扇区

MBR扇区位于整个硬盘的第一个扇区.

 

MBR,也叫主引导记录

 

MBR扇区结构

 

; MBR

; struct mbr {

;   char* boot;               // 引导程序

;   char* d_sig; /*optional*/ // Disk Signature, 磁盘签名

;   char* dpt;   /*optional*/ // DPT, Disk Partition Table, 硬盘分区表. 由N(4)个分区表项构成.

;   u2 flag;                  // 0x55, 0xaa

; }

这个是MBR结构的简单描述。

0-509:BS_BootCode。Bootstrap program. It is platform dependent and filled with zero when not used.

510-511:0xAA55. A boot signature indicating that this is a valid boot sector.

 

 

写道
| |
| ... |
------+-----+--- ~
^ ^ | | ^
| 64k+-----+ | 1048575:0xfffff
| v | ... | |
| ---+-----+ | 983040:0xf0000
| ^ | | |
| 64k+-----+ | 983039:0xeffff
| v | ... | |
| ---+-----+ | 917504:0xe0000
| | | |
| +-----+ | 917503:0xdffff
| | ... | |
| +-----+ | 851968:0xd0000
| | | |
| +-----+ | 851967:0xcffff
| | ... | |
| +-----+ | 786432:0xc0000
| | | |
| +-----+ | 786431:0xbffff
| | ... | |
| +-----+ | 753664:0xb8000
| | | |
| +-----+ | 753663:0xb7fff
| | ... | |
| +-----+ | 720896:0xb0000
| | | |
| +-----+ | 720895:0xaffff
| | ... | |
| +-----+ | 655360:0xa0000
| | | |
| +-----+ | 655359:0x9ffff
| | ... | |
| +-----+ | 589824:0x90000
| | | |
| +-----+ | 589823:0x8ffff
| | ... | |
| +-----+ 1M 524288:0x80000
| | | |
| +-----+ | 524287:0x7ffff
| | ... | |
| +-----+ | 458752:0x70000
| | | |
| +-----+ | 458751:0x6ffff
Low | ... | |
Memory +-----+ | 393216:0x60000
(1M) | | |
| +-----+ | 393215:0x5ffff
| | ... | |
| +-----+ | 327680:0x50000
| | | |
| +-----+ | 327679:0x4ffff
| | ... | |
| +-----+ | 262144:0x40000
| | | |
| +-----+ | 262143:0x3ffff
| | ... | |
| ---+-----+ | 196608:0x30000
| ^ | | |
| 64k+-----+ | 196607:0x2ffff
| v | ... | |
| ---+-----+ | 131072:0x20000
| ^ | | |
| 64k+-----+ | 131071:0x1ffff
| v | ... | |
| ---+-----+ | 65536:0x10000
| ^ | | |
| 64k+-----+ | 65535:0x0ffff
| | | ... | |
| | +-----+ | 32256:0x07e00 - -
| | |0xaa | | ^ ^
| | +-----+ | 32255:0x07dff, mbr to here. boot sector:512 bytes 0xaa55
| | |0x55 | | | v
| | +-----+ | 32254:0x07dfe | - -
| | | ... | | | ^ ^
| | +-----+ | 32239:0x07def | | the 4th partition:16 bytes -
| | | | | | | v Boot indicator
| | +-----+ | 32238:0x07dee | | - -
| | | ... | | | | ^
| | +-----+ | 32223:0x07ddf | | the 3rd partition:16 bytes -
| | | | | | | v Boot indicator
| | +-----+ | 32222:0x07dde | dpt - -
| | | ... | | | | ^
| | +-----+ | 32207:0x07dcf | | the 2nd partition:16 bytes -
| | | | | | | v Boot indicator
| | +-----+ | 32206:0x07dce | | - -
| | | ... | | | | ^ ^
| | +-----+ | 32203:0x07dcb | | | Number of sectors in the partition:4 bytes
| | | | | | | | v
| | +-----+ | 32202:0x07dca | | | -
| | | ... | | | | | ^
| | +-----+ | 32199:0x07dc7 | | | Number of sectors preceding the partition:4 bytes
| | | | | | | | v
| | +-----+ | 32198:0x07dc6 | | | -
| | | | | | | | Ending low cylinder number
| | +-----+ | 32197:0x07dc5 | | | -
| | | | | | | | Ending sector and high cylinder number
| | +-----+ | 32196:0x07dc4 | | | -
| | | | | | | | Ending head number
| | +-----+ | 32195:0x07dc3 | | | -
| | | | | | | | System indicator
| | +-----+ | 32194:0x07dc2 | | | -
| | | | | | | | Beginning low cylinder number
| | +-----+ | 32193:0x07dc1 | | | -
| | | | | | | | Beginning sector and high cylinder number
| | +-----+ | 32192:0x07dc0 | | | -
| | | | | | | | Beginning head number
| | +-----+ | 32191:0x07dbf | | the 1st partition:16 bytes -
| | | | | | v v Boot indicator
| | +-----+ | 32190:0x07dbe | - - -
| | | ... | | (512 bytes places mbr) v
| | +-----+ | 31744:0x07c00, 0x007c0:0x0000, 0x00000:0x7c00. mbr from here.-
| | | | |
| | +-----+ | 31743:0x07bff
| | | ... | |
| | +-----+ | 01280:0x00500
| | | | |
| | +-----+ |
| | | ... | |
| | +-----+ |
| | | | |
| | +-----+ |
| | | ... | |
| | +-----+ | 01024:0x00400
| | | | |
| | +-----+ | 01023:0x003ff
v v | ... | v
------+-----+--- 00000:0x00000

 

 

DPT

 

 

主引导程序执行过程

1、执行一次远跳转

引导程序被加载到0x7C00处执行,该物理地址可以认为是代码段寄存器CS为0x0000,IP为0x7C00,也可以认为代码寄存器CS为0x07C0,IP为0x0000,在有些地方,比如在模拟器下,比如Bochs,引导程序被加载后,代码段寄存器CS置为0x0000,IP置为0x7C00,所以需要一次长跳转,将代码寄存器CS置为0x07C0,IP置为0x0000。当然这个也不是必须的,因为引导程序只有512字节,CS为0x0000,IP为0x7C00也足够引导程序执行使用。只是如果需要在这个位置加载其他程序执行时,如果程序比较长,超过了IP能够寻址的范围,就有可能出现问题。

 

2、做些简单的初始化工作

引导程序通常只有一个代码段,一些数据,直接放在代码后面,这意味着数据段使用的是和代码段同一块内存空间,需要将数据段寄存器置为代码段寄存器。

 

必要的话初始化实地址模式下的中断,主要是中断向量表,将中断向量表移动到一个安全位置。

初始化vga

 

3、从实地址模式进入到保护模式

内存探测

初始化GDTR

打开A20地址线

开启保护模式:设置CR0寄存器的保护模式开启标志位(第0位)

执行远跳转

 

4、引导加载内核程序

 

5、跳转到内核程序执行

在跳转到内核程序执行之前,还要初始化相关段寄存器,包括代码段寄存器、数据段寄存器以及堆栈段寄存器。

如果内核程序是以PE格式提供,还需要根据PE格式重新调整相关段寄存器,包括代码段寄存器、数据段寄存器以及堆栈段寄存器。

 

初始化代码段寄存器以便让代码段寄存器加段偏移只想内核程序代码的开始位置去执行。初始化数据段寄存器也是一样。初始化堆栈段寄存器以便为内核程序运行准备好将要使用的堆栈空间。

 

6、调用内核程序的入口函数去执行内核程序的初始化工作。

 

 

FAT分区引导程序

 

引导区

 

分享到:
评论

相关推荐

    Mac OS X Lion 10.7.5

    以下是关于Mac OS X Lion 10.7.5的一些关键知识点: 1. **多点触控手势增强**:Lion引入了更多基于触摸板的多点触控手势,如全屏切换、捏合滚动、平滑滚动以及应用切换等,这些功能使得用户在没有触控屏的Mac上也能...

    网管教程 从入门到精通软件篇.txt

    网管教程 从入门到精通软件篇 ★一。★详细的xp修复控制台命令和用法!!! 放入xp(2000)的光盘,安装时候选R,修复! Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的...

    ROS电子盘复制工具DDCOPY_1.5_liunx硬盘备份img工具

    将第2硬盘第1分区上的数据复制到第1硬盘的第2分区上,并保存到映像文件“p21.img”中, 并设定分卷容量为634MB (649216KB)。 ddcopy -p s=x:\p21.img d=2:1,1:2 将映像文件“p21.img”中的数据复制到第2硬盘的第1...

    整理的计算机应用基础简答题.pdf

    - 第二代计算机引入了晶体管和操作系统,开始处理事务。 - 第三代计算机采用集成电路,出现了分时操作系统。 - 第四代计算机是大规模和超大规模集成电路的时代,微型计算机成为主流。 2. **计算机应用**: - ...

    操作系统实验心得(精选多篇).doc

    文章共分为两篇,第一篇是操作系统实验心得,第二篇是操作系统实验总结。 操作系统实验心得 1. 络真的很强大,用在学习上将是一个非常高效的助手。在学习操作系统实验时,需要善于使用络来快速找到相关资料,从 ...

    计算机课程讲解第八九章整理.pdf

    1. 按攻击的操作系统:如DOS、Windows、UNIX或OS/2等。 2. 按传播媒介:单机病毒通过磁盘传播,网络病毒通过网络传播。 3. 按链接方式:源码型、入侵型、外壳型、操作系统型。 4. 按寄生方式:文件型、系统引导型和...

    硬盘数据恢复入门教程.docx

    引导程序用于判断本分区根目录前两个文件是否为操作系统的引导文件(如MS-DOS中的IO.SYS和MSDOS.SYS),然后将第一个引导文件读入内存并交予控制权。 - **BPB**: 记录分区的起始扇区、结束扇区、文件存储格式、根...

    自己动手写操作系统(含源代码).part2

    在第二版中,你将会看到,你已经可以通过交叉编译的方式为我们的实验性 OS编写应用程序了,也就是说,它已经具备操作系统的基本功能,虽然仍然极其简陋,但第一个圈,毕竟是已经圆起来了。第三,实践类的操作系统...

    黑苹果常用系统工具

    2. **.DS_Store**:这是Mac OS X系统中一个隐藏文件,存储了Finder关于文件夹的布局和设置信息。在压缩包中出现可能是用户在整理文件时产生的,通常对黑苹果系统工具的使用影响不大。 3. **dspci**:这是一个命令行...

    Harddisk-winpe-c--v20170717.zip

    这是常用的方式,使用GHOST软件将本镜像恢复到硬盘的第一活动的主分区(HD1,1),然后再安装新的操作系统到第二分区、第三分区、第四分区……系统安装完成后启动新系统,使用windows自带的磁盘管理软件将(HD1,1)分区不...

    Firefox火狐浏览器官方Setup 95.0.2-win64版本exe安装包

    《Firefox火狐浏览器95.0.2-win64版本安装详解》 Firefox火狐浏览器,作为一款全球知名的开源网络浏览器,以其强大的安全性能、高度的定制化和丰富的扩展插件备受用户喜爱。本文将详细解析Firefox火狐浏览器95.0.2-...

    自己动手写操作系统(含源代码).part1

    在第二版中,你将会看到,你已经可以通过交叉编译的方式为我们的实验性 OS编写应用程序了,也就是说,它已经具备操作系统的基本功能,虽然仍然极其简陋,但第一个圈,毕竟是已经圆起来了。第三,实践类的操作系统...

    sqlanywhere5

    8. **SETUP.EXE**:这是主安装程序文件,用户通过它来启动和引导整个安装过程。 Adaptive Server Anywhere 5.5的知识点包括: - 数据库引擎: ASA5.5提供了高效的SQL查询引擎,支持事务处理和并发控制,适合各种...

    在windows下安装_雪豹苹果操作系统_的详细图文教程(win7_mac苹果_双系统安装)-------整理完整版

    3. **配置开机引导程序**:安装第三方引导软件,如rEFIt或rEFInd,以便在Windows和雪豹之间切换启动。 4. **使用苹果光盘镜像安装雪豹**:通过修改过的分区启动雪豹的安装程序,开始安装过程。 5. **启动雪豹**:...

    计算机应用技术(实用手册)

    这里的IDE设备包括了IDE硬盘和IDE光驱,第一、第二组设备是指主板上的第一、第二根IDE数据线,一般来说靠近芯片的是第一组IDE设备,而主设备、从设备是指在一条IDE数据线上接的两个设备,大家知道每根数据线上可以接...

    认识Windows7系统教案.docx

    **引导加载器**:BIOS 加载引导加载器(通常是硬盘上的第一个扇区),引导加载器负责加载操作系统的核心文件。 4. **加载核心文件**:操作系统的核心文件被加载到内存中,开始执行操作系统内核。 5. **初始化服务...

Global site tag (gtag.js) - Google Analytics