问题一:计算机在开机时候发生了什么?
首先,了解计算机的思想,最早计算机的思想:图灵机
图灵机的过程决定了计算机执行的方式,计算机如何执行:取指执行
所以当打开电源后,计算机首先取出一条指令执行。
BIOS:basic input output system
IP:指令指针寄存器
CS:代码段寄存器
在Intel结构下一个地址由两部分组成,即IP和CS,形成一个地址:CS << 4 +IP
磁盘中0磁道0扇区为操作系统的引导扇区:是操作系统中的第一段代码
通过设置CS和IP,指向0x7c00处的代码,并执行。
引导扇区中存放的程序为bootsect.s(s代表汇编),该程序的作用为将操作系统的如下部分依次读入执行。
首先读入执行setup模块:
此时,执行setup模块后会将microsoft的logo以及loading system打印在屏幕上,并接着读入操作系统的system模块。
问题回顾:计算机开机时候bootsec如何工作?
操作系统在硬盘上,计算机的的工作原理就是取指执行。
所以操作系统的引导扇区(即bootsec.s程序)完成这个功能:将操作系统从磁盘上加载到内存里,之后才可以取指执行。即首先读入setup(将操作系统的logo打印在屏幕上),然后将system模块读入。
setup详解:
1.读入光标位置,扩展内存数(即内存的大小),显卡参数,根设备号。
2.移动代码,最后使得内存中从0地址开始是操作系统,之后的内存才存放其他内容。
3.从16位模式进入到保护模式(32位模式),因为16位模式能表示的地址数不够了。此时意味着CPU的地址解释方式变化。
4.通过调整CS和IP(使用新的解释方式)使得指到0地址,即跳到system模块执行。
所以操作系统的顺序必须为:
bootsec-->setup-->system
system模块详解:
第一部分代码为head.s,该代码进行初始化 ,设置页表,GDT表(全局描述表),IDT表(中断描述符表,记录了0~255的中断号和调用函数之间的关系。)
makefile文件用于控制程序的执行规则
然后从head.s跳转到执行main.c函数(为c语言的函数)
此时进入main.c函数,用于初始化参数
main函数永远没有返回,在main函数中进行一系列的初始化,其中包括内存 初始化即mem_init:
从该程序可以看出页表的每一块的大小为4k,将没使用的内存全部置为0。
总结
操作系统启动时候做的事:
1.将操作系统读入内存
2.初始化(操作系统管理硬件,对硬件结构进行初始化,获得硬件参数等)