操作系统----第一章
这里写目录标题
- 计算机是怎么工作的
- 问题提出
- 计算机的产生
- 图灵机
- 通用图灵机
- 计算机
- 操作系统启动
- 电源键开启后,计算机干了什么
- 引导扇区的代码(bootsect.s)
- 移动boot代码
- 将setup代码载入到内存(仅仅载入,不执行)
- 载入setup后,打印字符并载入system模块
- boot代码的最后,准备转入setup执行
- setup模块代码
- 一级目录
- 二级目录
- 二级目录
- 二级目录
- 一级目录
- 二级目录
- 二级目录
- 二级目录
- 一级目录
- 二级目录
- 二级目录
- 二级目录
- 一级目录
- 二级目录
- 二级目录
- 二级目录
- 一级目录
- 二级目录
- 二级目录
- 二级目录
计算机是怎么工作的
问题提出
计算机的产生
图灵机
图灵机就是模拟人脑的计算过程,缺点是他只有一套固定的逻辑
通用图灵机
而通用图灵机,他在图灵机的基础上进行了改进,他可以修改控制器的逻辑,向控制器中导入不同的逻辑,来实现不同的功能,这里的“设置控制器动作”就是控制不同的逻辑的,这一动作依赖于我们的编写的程序,我们的程序代码就是上图中的菜谱,程序代码用来设置控制器动作
计算机
将程序代码和数据存储到起来,这里的存储指的是计算机的内存,之后“运算器、控制器”会从内存中取代码指令,然后执行,这就是计算机的雏形,关键在于“取指执行”
程序代码会被翻译为汇编语言代码,每一行汇编代码,都规定了一个逻辑
计算机有一个指针,称为IP指针(也称PC指针),他会指向当前执行的程序代码,每次IP指针将程序代码传给控制器和运算器,控制器和运算器拿到逻辑和数据后,进行逻辑执行。总结下来就是 取指执行,计算机是如何工作的:取值执行
操作系统启动
电源键开启后,计算机干了什么
首先,CPU处于实模式,该模式下,该模式的寻址就是“段首址 左移四位 + 偏移地址”,而CS初始值是0xFFFF,IP初始值是0x0000.所以,CS会左移四位+IP,这里的CS和IP都是十六进制,<<4,转换成十六进制就是数字右边多个0,之后+IP,IP也是0,所以寻址之后就是0xFFFF0,而这就是BIOS程序在内存中的固定固化位置(故意这样设计,使得计算机在开机时百分百获取到IO功能,从而后续可以进行“代码载入到内存,以及从内存读代码到CPU”的工作),BIOS是基础IO系统,是一套最基本的输入输出系统,可以用来进行初始的取指令,从而交给“运算器和控制器”执行
之后检查外设,都没问题之后,
之后,BIOS(基本IO系统)将磁盘0磁道0扇区开始的一个扇区(512B大小)的代码读入到内存的0x7c00处开始。磁盘的0磁道0扇区称为引导扇区,这一块引导扇区的代码,就是操作系统的第一块代码
然后重置CS=0x07c0,IP=0x0000
所以,“控制器和运算器”就会去顺序执行CS:IP处的代码,每次都通过BIOS取指令
引导扇区的代码(bootsect.s)
移动boot代码
1、“.s”后缀是汇编文件的后缀,说明引导扇区的代码是汇编语言,与高级语言C语言的一个区别是,高级语言代码无法百分百的控制运行(如变量的地址是无法控制的),而汇编会百分百控制
2、代码段的代码解释:
刚开始的两行,是将两个宏的内容给到DS和ES,两个宏在图的右上角
而cx是计数寄存器,相当于循环变量
之后将SI和DI的寄存器内容置0
(其中,DS:SI配合寻址,ES:DI配合寻址)
rep movw,会与cx配合,这里是指重复移动256个字的内容,256字就是512B,相当于将整个引导扇区的汇编代码从0x7C00:0x0000处,移动到0x9000:0x0000
(低地址处留出了位置,具体用处后面会讲)
之后jumpi的作用是,将go这个标号所在位置的指令的地址相对于当前CS段地址的偏移量,赋值给IP指针,将INITSEG这个宏的内容赋值给CS代码段段首址寄存器
(因为当前的代码已经被整体挪到了0x9000:0x0000的位置,所以这个jumpi的作用是跳转到0x9000:0x偏移量,而go标号就在下一行,所以实际上相对而言还是顺序执行,但是又必不可少要在rep移动后执行该动作,因为程序已经挪动过了)
将setup代码载入到内存(仅仅载入,不执行)
后续代码简略说明:
1、中断,0x13是读磁盘扇区的中断,我们接下来要继续读磁盘了
2、cl规定了读磁盘时的开始扇区,al规定了读几个扇区
这里cl为02,即读第二个扇区,开始读4个,如上图下面所示,这4个扇区就是setup的扇区
3、从磁盘读到内存的哪个地址开始?,读到es:bx,即逻辑地址0x90200处,这个地址与0x90000正好差了512B
(需要注意的是,这里是向高地址顺位读,并没有占用我们之前移动bootsect所留下的地址空间(低地址处))
载入setup后,打印字符并载入system模块
最后,boot还要做两个工作:
1、0x10号中断,表示显示字符,而我们打印的字符就是下面双引号中的内容,上图的2处,表示字符的个数,当前是24个字符
(这个打印,与我们自己的电脑开始时的那个Windows图标是一样的,只不过win的那个很精致,我们这里很粗糙,只是打印了一行字)
2、然后会调用一个函数(即call的作用)
将下一个模块,就是system的模块,载入到内存(仅仅载入,并不执行)
boot代码的最后,准备转入setup执行
1、简要解释了一下system模块为什么要用call
2、转入setup执行,因为boot已经将setup模块和system模块的代码载入到了内存(即从磁盘读出,放入内存了)
之后,修改CS:IP的值,CS=0x9020,IP=0x0000,所有,会转入setup模块在内存中的首地址0x90200处开始执行