当执行万恶之源(printf("Hello World!"))时,计算机都做了些啥??
当计算机执行万恶之源(printf("Hello World!"))他都做了些啥??
先看一张图:
一条printf("Hello World!)的流程,大概如下:
1、CPU发一些指令给内存
2、把内存中的数据写入显存进行展示
所以在冯诺依曼计算机的组成有以下几个部分:运算器,控制器,存储器,输入设备/输出设备
还有三条总线:
DB(数据总线):Data Bus,是一条双向的用来传输数据的信息的总线
AB(地址总线):单向的传输一些MPU发出的地址信息
CB(控制总线):总体上双向传输一些控制信息,时序信号和状态信号
典型的PC结构逻辑上是由北桥和南桥芯片组成,包括主存和各种I/O设备等等,PCI总线之上的北桥和一些快速设备(主存,显卡),ISA总线之上的南桥和一些慢速设备(中断,声卡等等),至于快慢的划分,则是通过传输的数据量的大小来判断的,也是为了更加有效合理实时的传输数据。
计算机早期模型,从图灵机发展到通用图灵机的区别:
图灵机是一种基于计算模型设计的,有控制器,纸带以及连接设备,类比于人,笔,纸,当完成2+3=5时,图灵机也是一样的工作流程,控制器相当于人脑进行运算,最后运算的结果被写到了纸带上,这里的图灵机只有一种加法运算。
但是当我们控制器中引入了修改控制器之后,通过设置控制器动作,改变控制器状态,就可以根据数据对象的不同完成加法或者乘法运算,其实就相当于,CPU可以读入不同的逻辑,从而完成不同的执行结果。
如果把乘法和加法改成我们经常使用的程序,就相当于,运行QQ时,载入QQ程序,然后计算机解释执行;运行微信时,载入微信程序,计算机解释执行。
这一切都是根据冯诺依曼的存储程序思想,对于程序,计算机本质上就是,取址执行,取址执行,取址执行这样一个过程。
官方概括一点来说,计算机的主要思想就是:将程序和数据存放到计算机内部的存储器中,计算机在程序的控制下一步步进行处理。
分为以下几个步骤:程序被读入内存,使用指针指向指令(IP),自动地取址执行,最后产生结果
计算机是被程序控制的。
操作系统也是一种程序。
一般理解一下操作系统,就是覆盖在计算机硬件的一层软件,向用户开放使用硬件的接口,管理硬件,提高系统资源利用率
不会真有人运行一句万恶之源(printf("Hello World!")),还想要去操作一下硬件吧?不会吧不会吧?
当电脑开机上电时,计算机都做了一下啥?上电之后,执行的第一条语句又是啥?
这里先来说一下CPU的寻址方式:
我所知道的,就是分为两类,一种是16位机寻址模式,一种是32位机寻址模式,16位机寻址模式,被称为实模式,而32位机寻址模式,被称为保护模式。
在实模式下,CPU的寻址方式为:CS<<4+IP,CPU的寻址地址,都是由段寄存器基址(CS加上段偏移(IP)组成,具体来说,就是段寄存器地址左移4位加上偏移地址,段寄存器是16位的,左移四位加上IP,就变成了20位,20位的地址是多大的地址空间——220,也才1M啊,但是我们CPU需要4G的寻址能力啊,内存那么大,CPU不想去看看吗?
所以就有了保护模式,保护模式下的寻址,就不是简单的CS<<4+IP了,CS也变成了选择子,也就是说,CS不再是一个具体的地址,而变成了一个表中的索引,真正的地址存放在表项中,保护模式的地址是根据CS进行查表获得的,查表获得地址,在和IP做偏移运算。
这里的表,就是gdt表(global description table,全局描述符表),先理解一下是通过硬件生成的地址表就行了,用硬件实现也是为了让CPU寻址快一点。
我要开始说开机了。
开机之后,CPU肯定是处于实模式的,然后我们的CS=0xFFFF,IP=0x0000,所以我们CPU第一次寻址,就是去0xFFFF0,0xFFFF0,是哪里?
不知道大家有没有了解过BIOS(Basic Input Output System),BIOS是固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。
所以开机之后,我们的CPU肯定先跳到BIOS区执行程序,检查我们的RAM,键盘,显示器,软硬磁盘等等,然后把磁盘上的0磁道0扇区读入地址0x7c00,最后设置我们的CS=0x07c0, ip=0x0000,0磁道0扇区这里有512B的程序,里面装的是什么。
0磁道0扇区,又被称为引导扇区,现在我们0x7c00里面就放了这样一段bootsect.s代码,BIOS设置了我们CPU取址地址变为0x7c00,就是正好跳到这个地址去执行bootsect.s代码。
引导扇区做了些什么事,我的理解就是搬运了一下setup.s代码,然后让我们的CPU跳到这个代码块去执行。
操作系统也是程序,所以也要从磁盘载入内存才能被执行。
bootsect.s执行完了,到我们的setup.s了,这里完成的功能就比较多了。
首先,我们的setup需要开始接管硬件,所以需要知道内存大小等等信息,先知道我们计算机的状况,认知之后生成一个数据结构(表),然后就可以开始接管硬件,
然后,把OS的核心模块System移动到0地址处,
再然后,让我们的计算机启动保护模式,通过改变cr0最后一位(0 16位实模式 1 32位保护模式),完成我们的模式切换,这下我们的CPU就会走另外一条解释执行电路
最后,跳到0地址处执行System模块