I386体系结构(下)
摘要:上半期我们一起学习了I386体系结构,下半期我们的主要目标是实现一个能启动而且可以进入保护模式的简易操作系统。所以本期首先来分析一下计算机的启动流程,然后着手学习开发一个基于I386体系的可启动系统。
Linux启动流程
我们先来分析系统的启动流程吧!
硬件准备
计算机加电的瞬间,整个系统包括RAM在内的几乎所有部件,都处于一种随机的混乱状态,所以根本谈不上做什么实际工作。因此,启动机器首先得将系统带出这种黑暗和混乱的状态。
硬件在这个时候必须责无旁贷,挺身而出。启动一开始,硬件系统(是主板吧!)就会给CPU的Reset的管脚发送一个信号,促使CPU将自己的主要寄存器(包括cs和eip)设置为启动状态——实际上就是把这些寄存器的内容设置成一些预定值(cs=F00h,eip=FFF0h)。我们都知道指令寄存器(eip)决定系统下一步要执行什么,所以指令寄存器被预置成一个固定值,那么该固定位置上的指令就会被执行——在这里eip指向了位于物理地址0xFFFFFFF0上的指令,所以该指令便作为系统加电后执行第一条指令了。
硬件系统通常会把一个只读芯片的存储区映射到这个位置上(0xFFFFFFF0)——这种芯片一般来说就是ROM。所以ROM中存放的程序就会被调用执行——换句话说就是机器加电后首先执行ROM中存放的程序,传统上称该程序为BIOS(Basic Input/Output System)。
BIOS的作用
按照启动流程,该谈谈BIOS了。
BIOS是固化在机器ROM芯片中的一小片程序,在机器启动后会首先执行这片代码。那么这段代码到底是做什么的呢?为何要首先执行它呢?
要回答这个问题,就要想想计算机的启动过程。也许你不加思索的回答说,启动就是计算机从磁盘里调入操作系统,然后开始运行它。豪无疑问,你回答是正确的,但是你忽略了一点——机器发现磁盘,找到操作系统在磁盘中位置这个“小”过程。显然这个过程不能借助于磁盘中的程序来完成,因为还没找到磁盘啦,所以机器自己必须“留一手”,用本身“自带”的程序来找磁盘,读磁盘数据。这一手就是BISO中的程序片。
别小看这小片程序,它可是关系系统能否正常启动的关键数据呀,所以必须保护它不会被篡改,这也正式为什么要把它固化在 ROM中的原因。一般情况下BIOS中的数据不会被破坏,但也由些特例,比如陈英豪搞的CIH病毒,这个可恶的病毒会破坏BISO数据(只能破坏那些可写入的几款BISO),造成的系统无法启动。
具体的讲,BISO 中的程序包含POST(加电自检)、开机菜单设置、装载引导扇区和 BISO中断等几部分程序片。
l POST会在开机后首先运行,去检测内存大小和初试化硬件设备(对于基于PCI总线的体系结构,这个过程很关键,因为只能通过这个过程来保证所有的硬件设备不会因为中断或I/O端口等资源发生冲突。这个过程完成时,会在屏幕上显示系统中PCI设备的清单。
l 接着启动菜单(setup menu)被执行。启动菜单程序为用户提供设置系统参数(如时钟,启动设备等)的配置界面(多数情况下,用户开机时按下”DEL”键盘,会进入配置界面)。
l 再下来就时从启动设备中装载引导扇区(第0个扇区),即加载第0个扇区,载入位置固定在0000:7C00处(这是个默认的规定)。
l 而ROM中的 BISO中断程序则是用来控制屏幕、键盘、磁盘驱动、串口等简单驱动设备的。引导扇区被载入时就会很频繁的调用这些中断来读取磁盘扇区数据 (这些中断在系统启动后,不一定再继续被使用,比如Linux系统中就会重写这些中断程序,不过也有系统仍然使用BISO中断,比如DOS系统)。
总结一下,BISO首先会执行自检程序,然后可按用户需要进入启动菜单进行系统配置;如果不需要配置则去启动设备载入引导扇区。到此BISO的任务完成了,剩下的启动任务都交接给引导扇区中程序去继续完成吧。总而言之,BISO要做的就是找到启动设备(启动分区所在设备),然后从中读取第0个扇区(启动扇区了)就OK了。
摘要:上半期我们一起学习了I386体系结构,下半期我们的主要目标是实现一个能启动而且可以进入保护模式的简易操作系统。所以本期首先来分析一下计算机的启动流程,然后着手学习开发一个基于I386体系的可启动系统。
Linux启动流程
我们先来分析系统的启动流程吧!
硬件准备
计算机加电的瞬间,整个系统包括RAM在内的几乎所有部件,都处于一种随机的混乱状态,所以根本谈不上做什么实际工作。因此,启动机器首先得将系统带出这种黑暗和混乱的状态。
硬件在这个时候必须责无旁贷,挺身而出。启动一开始,硬件系统(是主板吧!)就会给CPU的Reset的管脚发送一个信号,促使CPU将自己的主要寄存器(包括cs和eip)设置为启动状态——实际上就是把这些寄存器的内容设置成一些预定值(cs=F00h,eip=FFF0h)。我们都知道指令寄存器(eip)决定系统下一步要执行什么,所以指令寄存器被预置成一个固定值,那么该固定位置上的指令就会被执行——在这里eip指向了位于物理地址0xFFFFFFF0上的指令,所以该指令便作为系统加电后执行第一条指令了。
硬件系统通常会把一个只读芯片的存储区映射到这个位置上(0xFFFFFFF0)——这种芯片一般来说就是ROM。所以ROM中存放的程序就会被调用执行——换句话说就是机器加电后首先执行ROM中存放的程序,传统上称该程序为BIOS(Basic Input/Output System)。
BIOS的作用
按照启动流程,该谈谈BIOS了。
BIOS是固化在机器ROM芯片中的一小片程序,在机器启动后会首先执行这片代码。那么这段代码到底是做什么的呢?为何要首先执行它呢?
要回答这个问题,就要想想计算机的启动过程。也许你不加思索的回答说,启动就是计算机从磁盘里调入操作系统,然后开始运行它。豪无疑问,你回答是正确的,但是你忽略了一点——机器发现磁盘,找到操作系统在磁盘中位置这个“小”过程。显然这个过程不能借助于磁盘中的程序来完成,因为还没找到磁盘啦,所以机器自己必须“留一手”,用本身“自带”的程序来找磁盘,读磁盘数据。这一手就是BISO中的程序片。
别小看这小片程序,它可是关系系统能否正常启动的关键数据呀,所以必须保护它不会被篡改,这也正式为什么要把它固化在 ROM中的原因。一般情况下BIOS中的数据不会被破坏,但也由些特例,比如陈英豪搞的CIH病毒,这个可恶的病毒会破坏BISO数据(只能破坏那些可写入的几款BISO),造成的系统无法启动。
具体的讲,BISO 中的程序包含POST(加电自检)、开机菜单设置、装载引导扇区和 BISO中断等几部分程序片。
l POST会在开机后首先运行,去检测内存大小和初试化硬件设备(对于基于PCI总线的体系结构,这个过程很关键,因为只能通过这个过程来保证所有的硬件设备不会因为中断或I/O端口等资源发生冲突。这个过程完成时,会在屏幕上显示系统中PCI设备的清单。
l 接着启动菜单(setup menu)被执行。启动菜单程序为用户提供设置系统参数(如时钟,启动设备等)的配置界面(多数情况下,用户开机时按下”DEL”键盘,会进入配置界面)。
l 再下来就时从启动设备中装载引导扇区(第0个扇区),即加载第0个扇区,载入位置固定在0000:7C00处(这是个默认的规定)。
l 而ROM中的 BISO中断程序则是用来控制屏幕、键盘、磁盘驱动、串口等简单驱动设备的。引导扇区被载入时就会很频繁的调用这些中断来读取磁盘扇区数据 (这些中断在系统启动后,不一定再继续被使用,比如Linux系统中就会重写这些中断程序,不过也有系统仍然使用BISO中断,比如DOS系统)。
总结一下,BISO首先会执行自检程序,然后可按用户需要进入启动菜单进行系统配置;如果不需要配置则去启动设备载入引导扇区。到此BISO的任务完成了,剩下的启动任务都交接给引导扇区中程序去继续完成吧。总而言之,BISO要做的就是找到启动设备(启动分区所在设备),然后从中读取第0个扇区(启动扇区了)就OK了。