哈工大李治军老师操作系统笔记【1】:什么是操作系统 & 揭开钢琴的盖子(Learning OS Concepts By Coding Them !)

30 篇文章 67 订阅

0 什么是操作系统?


在这里插入图片描述

以上的答案为计算机。


在这里插入图片描述


屏幕怎么输出我们想要显示的内容(hello)?CPU发送指令给内存,如图所示内存地址为300,要把这些ASCII码放到显存当中,把地址为300的内容取出来,放到地址为777的显存上,然后上电,就输出了个“h”,之后的“ello”同理,地址逐渐+1即可。但是这样是不是太麻烦了一点?可以简单,直接printf("Hello"),那为什么可以调用这个指令而不是直接去调用硬件?答:有了操作系统之后,给这个计算机穿上衣服,使得使用上更方便,就不用直接去操作硬件了,这就是操作系统,在硬件上包了一层软件。


在这里插入图片描述


操作系统的层次:


在这里插入图片描述


1 揭开钢琴的盖子,Open the OS!

如下是计算机系统的基本结构,操作系统出于这个位置就决定了他要干什么事,计算机要使用硬件,就要使用操作系统提供的接口来实现,比如说printf指令。


在这里插入图片描述


我们要做的是穿过这个接口,来看操作系统内部,只会用接口,用途无从谈起。

1.1 如何控制开机界面

在这里插入图片描述
黑色的背后发生着什么?开机要干什么事?

1.2 从白纸到图灵机

图灵机借鉴了人在纸上计算的这个过程,就比如说要计算1+2,图灵机是怎么样运算的呢?图灵机的基本组成如下:

  • 有一条「纸带」,纸带由一个个连续的格子组成,每个格子可以写入字符,纸带就好比内存,而纸带上的格子的字符就好比内存中的数据或程序;
  • 有一个「读写头」,读写头可以读取纸带上任意格子的字符,也可以把字符写入到纸带的格子;
  • 读写头上有一些部件,比如存储单元、控制单元以及运算单元:
  1. 存储单元用于存放数据;
  2. 控制单元用于识别字符是数据还是指令,以及控制程序的流程等;
  3. 运算单元用于执行运算指令;

运行步骤:

  • 首先,使用读写头把这三个字符全部写入到纸带上,这样纸带上就有三个数据了,分别是1,2,+这三个数据。
  • 之后,从1开始,分别把数据1和2读入存储设备当中,这个存储设备就称之为图灵机的状态。
  • 然后读入了1,2后,读写头会碰到+号,现在其会将+号传递给控制单元,控制单元发现是一个+号而不是数字,所以没有存入到状态当中,这是因为+号是运算符的指令,作用是将状态进行相加,于是通过运算单元进行工作,之后运算单元收到后,要把加和的状态中的值通知后,就会把状态给读入进去,再把计算的结果1+2=3这个3存入状态当中。
  • 最后,运算单元返回给控制单元,控制单元将结果传输给读写头,读写头向右移动,把结果写入到纸带当中去。

在这里插入图片描述


1.3 从图灵机到通用图灵机


在这里插入图片描述


首先是把一套逻辑读进来,把控制器形成样子,再在样子基础上再出结果,怎么去设置控制器逻辑,这个控制器就会怎么工作,读进来是+法就是+法图灵机,*法就是*法图灵机。

1.4 从通用图灵机到计算机

把程序输入进去,存到内存里,程序载入到控制器中解释执行,就能得到结果。


在这里插入图片描述


IP指针指向的是所要执行命令的地址,PC是程序计数器,IR是指令缓存器,然后不断的取址执行去工作,这还是自动的。

PS:
常见的寄存器种类:

  • 通用寄存器,用来存放需要进行运算的数据,比如需要进行加和运算的两个数据。
  • 程序计数器,用来存储CPU要执行下一条指令「所在的内存地址」,注意不是存储了下一条要执行的指令,此时指令还在内存中,程序计数器只是存储了下一条指令的地址。
  • 指令寄存器,用来存放程序计数器指向的指令,也就是指令本身,指令被执行完成之前,指令都存储在这里。

那么,1.1当中的黑色背景到底发生了什么事呢?从取址执行开始说起,取哪里的地址呢?PC,IP的地址,也就是执行下一条指令[所在的内存地址]。

1.5 第一句指令是什么?


在这里插入图片描述
TIPS:一个扇区=512Bytes


CS是段寄存器,IP是其偏移地址。CS和IP合起来就是要产生一个地址,CS<<4+IP(CS左移4位再加上IP),所一刚开始得到的地址就是0xFFF0,这个地址,也就是BIOS的地址,如果这段过不去的话,计算机就是坏了。

把0磁道0扇区读入512Bytes的空间,放到7C00处,就是引导扇区,也就是操作系统的第一个扇区,第一段代码,然后变更CS和IP,到引导扇区,自己写的代码肯定是从引导扇区开始的。

1.6 0x7C00处存放的代码


在这里插入图片描述


引导扇区的代码: b o o t s e c t . s bootsect.s bootsect.s(引导扇区)
. s .s .s对应的是汇编,因为如果用C写,C语言要进行编译,所以用汇编写,直接转换成机器代码,可以完全控制。


在这里插入图片描述


所以第一句语句执行完后, d s = 0 x 07 C 0 ds = 0x07C0 ds=0x07C0 e s = 0 x 9000 es = 0x9000 es=0x9000,这两个是段地址,还需要偏移地址IP(这里的ds对应的偏移地址是si,es对应的偏移地址是di,然后现在这两个偏移地址都被sub指令减成0了)

最后一行代码,go赋值给ip,initseg赋给cs。


在这里插入图片描述


接下来,bootsect挪了一下,到了下面的int 0x13,这是13号中断。要告诉磁盘从哪里开始读,从cl开始扇区开始读,cl是cx的低八位,所以cl是02,所以是第2个扇区开始读,那么读多少个扇区呢?看al,al是扇区的个数,al是ax的低八位,加上setuplen之后,al是4,实际上从boot扇区之后读4个扇区即可,正好是setup扇区,这4个扇区读到哪里?读到bootsect上面,90000+200(512bytes)=90200。就是90200这个地址,那怎么告诉他呢,es和bx合起来就是内存地址,ax是根据cs的,es是根据ax的,所以找到cs即可,cs=9000,段基址有了,bx就是200,果然,就是要把setuo的4个扇区读进来。


在这里插入图片描述


int 0x10也是个中断,这是个显示字符的bios中断,其实这就是黑色图片的logo的显示中断,这个中断就是打出logo,call又是读入system模块。

在这里插入图片描述

2 总结

开机,读入bootsect扇区,再读入setup扇区,之后再根据指令访问其他模块。

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值