一、计算机是什么
计算机本质是一个计算模型,是图灵机的实现。
(1)从图灵机到通用图灵机
-
图灵机:只能执行一种逻辑,比如只能做加法,逻辑是在图灵机的控制器中固定写好的(类似于直接将程序烧入硬件中)。
-
通用图灵机:把控制器中的逻辑处理部分抽离出来,通过别的方式动态放入到控制器中,此时这部分逻辑就类似于我们写的程序。可以通过向控制器中放入不同的处理逻辑来实现加法、减法等而不需要用两台图灵机来分别处理加减法。
(2)从通用图灵机到计算机
再结合冯·诺依曼的存储程序思想,使用存储器(内存)来存储程序,通过pc指针来指向要放入控制器中的逻辑,然后不断将pc指向的运算逻辑放入到控制器(cpu)中。
二、OS启动流程
boot模块:开机寻址(x86架构)CS:IP(CS=0xFFFF;IP为0x0000),找到ROM BIOS映射区,然后检查RAM、磁盘、显示器等硬件,然后将0磁盘0磁道0扇区的数据读入到0x7c00处,设置CS=0x07c0,IP=0x0000。0x07c0处为os开发人员存放磁盘引导扇区的地址,在此处读取512字节(引导扇区的内容),引导扇区的代码在一个bootsect.s(汇编程序)的文件中。这段汇编执行,又会将boot扇区后面的4个扇区读入到内存中(setup部分),在读入setup的四个扇区后,执行ok_load_setup(载入setup模块),然后打出logo,再继续读后面的system模块。在boot模块代码的末尾会跳转到setup模块进行执行。
setup模块:获取物理内存的大小,光标位置,显卡参数,根设备号等信息,即进行一些OS的初始化工作。同时将OS的system模块移动到0地址处,这也是为什么boot模块要放在0x07c0的位置,因为此时setup模块正在执行,不能被覆盖,所以提前预留出足够的空间(即0地址—0x07c0)存放操作系统,后期,os将一直处于该位置。最后setup模块让系统进入保护模式(开始32位寻址—靠gr0寄存器)。保护模式下地址翻译和中断处理靠GDT表和IDT表。
总之,setup模块的主要工作就是初始化物理参数,将system模块移动到0地址处,然后进入保护模式,开启32位寻址,然后使用32位的汇编指令,回到0地址处继续执行。
system模块:初始化IDT表和GDT表,然后OS开始执行一个main函数,此main函数其实就代表我们的运行的操作系统,是一个死循环,如果该循环终止了,则系统就死机了。main函数的工作就是初始化各种硬件、资源等,然后启动桌面。(内存初始化时,以4k为单位,所以一般页的大小为4k)
OS启动的总体步骤为:boot–>setup---->system的head.s---->system的main---->main函数执行各个mian_init函数进行资源初始化。