操作系统基本知识点链接:操作系统-语雀,语雀主要跟的是B站王道视频,本博客主要参考哈工大教材和王道操作系统,最后的期末复习主要针对北邮徐梦玮老师的OS课程。
从宏观的鱼度看,可以计算机系统分成三个基本组成部分:底层的计算机硬件、中间层的操作系统以及上层的计算机应用程序,操作系统属于承上启下的中间层,所以它在计算机系统中的地位和作用尤为重要;
操作系统是计算机系统中最基本的系统软件;
操作系统的层次结构如下,可以认为对操作系统来说,用户和应用进程等价,都是其服务对象;
之后的课程将主要介绍操作系统中的六个基本模块,即CPU管理、内存管理、外设管理、磁盘管理与文件系统、用户接口和启动模块,以及这些模块之间的内在联系;
Q:处理机和CPU有什么关系,是等价的吗?
A:可以简单的认为处理机=CPU+存储器+I/O接口,所以对于单核CPU等价于只有一个处理机;
DS:SI
和ES:DI
表示相关寄存器所引用的segment:offset;操作系统的理解从“走进操作系统开始”,系统启动无疑是操作系统的第一层面纱(本章最好参考王道视频,哈工大的教材有点过于偏向实操反而忽略了很多基础的知识点);
操作系统就是安装在计算机硬件之上的一个实实在在的软件,人们通过这个软件可以方便而高效地使用计算机硬件。
(1)操作系统是安装在计算机硬件之上的一层软件;
(2)操作系统之上可以安装各种应用程序软件;
(3)用户可以通过应用程序软件来间接使用操作系统,也可以直接使用操作系统,但通常都是通过操作系统来最终使用计算机硬件的;
(4)直接使用操作系统的含义就是让用户通过编写程序来调用操作系统提供的系统接口从而进入操作系统,而图1.1中的应用程序软件就是为调用这些系统接口而编写的程序;
(5)用户通过系统接口进入操作系统后使用计算机硬件,即用户必须“穿过”操作系统才能使用计算机硬件;
(6)操作系统管理计算机硬件,目的是让用户对计算机硬件的使用更加简便,也更加高效;
总结:操作系统是硬件和用户/应用之间的桥梁,操作系统管理硬件,为应用和用户提供服务;
操作系统在管理CPU的时候,抽象出来一个基本的概念——进程,因此CPU管理就变成了进程管理
;操作系统在管理磁盘等外部设备的时候,又抽象出来一个被称为文件的基本概念,这样磁盘管理又变成了文件系统
;
一个基本操作系统包含如下四个基本管理模块:进程管理、内存管理、I/O管理以及文件系统,再加上提供给上层应用的系统接口,就形成了如图1.3所示的操作系统结构(这只是最基本的操作系统结构,各种操作系统都是在其基础上迭代演化)
我们可以认为操作系统在整个计算机系统中扮演如下角色:
操作系统是一种系统软件,操作系统的基本特征包括并发、共享、虚拟和异步;
Q:系统软件和应用软件的区别?
A:
操作系统的并发性是指计算机系统中“同时”存在多个运行的程序,它具有处理和调度多个程序“同时”执行的能力;
Q:并发和并行的区别?
A:
基于单处理机的背景,实际上每个时刻仅能有一道程序执行,在一段时间内
,宏观上有多道程序在同时执行,微观上这些程序仍然是分时交替执行的 —— 操作系统的并发性是通过分时得以实现的;
而并行性需要有相关硬件的支持,要么是多流水线,要么是多处理机硬件;
共享也就是资源共享,是指系统中的资源可供内存中多个并发执行的进程共同使用,共享可分为以下两种资源共享方式:
虚拟是指将一个物理上的实体变为若干逻辑上的对应物;
操作系统利用了多种虚拟技术来实现虚拟处理器、虚拟内存和虚拟外部设备等:
简单来说,操作系统的虚拟技术可以归纳为:时分复用技术(处理器的分时共享)和空分复用技术(虚拟存储器)
异步是在多道程序环境下允许多个程序并发执行极有可能导致的进程与时间有关的错误,操作系统可以解决多道程序引发的异步问题,保证多次运行进程后都能获得相同的结果;
操作系统系统了一系列接口为用户服务,主要分为两类:
简单的批处理系统
“批处理”工作模式即计算机逐个执行每个任务,每个任务只有在执行完毕或出错以后才会切换去执行下一个任务;
批处理操作系统的任务就是在当前程序执行完毕或出错时,将下一个程序读入内存,并将程序执行指针设置为 放置下一个计算任务第一句代码所在的内存地址;
这样的操作系统实际上只能算是一个监控小程序,远不能算作是操作系统;
多道程序系统
假设有JOB1和JOB2,JOB1涉及外存的使用非常耗时,JOB2只进行科学计算;
多道程序的概念是指,可以同时启动JOB1和JOB2两个任务。首先执行J0B1,当其执行到外存读写操作时,CPU向外存发出操作指令后记住JOB1的当前执行状态,然后CPU切换到JOB2去执行,当J0B1的外存读写操作完成时,CPU保存JOB2当前的执行状态并切换回到JOB1,从那个保存下来的执行状态处继续执行;
多道程序是指计算机系统中有多个程序“同时”向前推进(这里的同时加引号是因为只有一个CPU,同时仅仅只是宏观上的感觉)
分时处理系统
在多道程序的基础上,MULTICS为了解决多个用户共同使用一台计算机的资源共享问题,让每一个用户启动的计算任务对应一个多道程序,通过切换让每个用户的任务都得到执行,同时引入“时间片”的概念,使得每个用户被分配到一个固定大小的时间片T,用完这个时间片后将CPU切换给下一个用户;
总结
根据操作系统的发展历史,可以总结出操作系统的核心轮廓,即多进程视图
和文件视图
;
无论操作系统如何演进,操作系统的基本思想——多道程序一直没有改变过,这依赖于现代计算机都以“存储程序”思想作为基本结构;因为程序执行和未执行的状态差别非常大,所以针对执行中的程序定义了进程的概念,也因此CPU在多个程序之间来回切换就变成了在多个进程之间不断交替执行,也就是著名的多进程切换视图
文件视图简单来说就是将所有的计算机外部设备都统一抽象成文件(类似于Linux“一切皆文件”的思想)
多进程视图让CPU和内存高效运转,用户程序在文件视图下使用各种外部设备,因此在多进程视图和文件视图下,整个计算机硬件系统不断高效运转,操作系统也就完成了其对计算机硬件的管理。因此,多进程视图和文件视图构成了操作系统的完整轮廓;
计算机本质上是一个计算模型,最著名的计算模型是图灵机
简单图灵机
模拟大脑->笔->纸张的计算过程,图灵机由控制器、纸带以及连接两者的读写指针组成
通用图灵机
当然简单图灵机只能做非常简单的加法、减法等单一的操作,简单图灵机经过演化得到通用图灵机
类比厨师做菜,简单图灵机就只是一个只会做一道菜肴的普通厨师,一个能看懂菜谱的厨师对应可以修改的控制器,不同的菜谱(做菜的步骤)对应设置控制器动作(这也就是现代计算机中的程序),数据对象对应按照菜谱做出的菜肴;
总结
通用图灵机已经非常接近现代“冯诺依曼”体系的计算机,我们可以得出结论,计算机的工作原理无非四个字——取值执行
(这一章我们可以参考汇编语言汇编语言 - Tintoki_blog (gintoki-jpg.github.io))
操作系统启动的主要工作就三项:系统准备、系统初始化和系统运转进入shell;系统准备又包括读入内核、启动保护模式、启动段页等,图1.30给出了系统启动过程的基本轮廓;
BIOS是计算机启动以后第一个运行的软件,和普通软件和操作系统都不一样,通常放在不可改的存储器上面,被称为固件;
BIOS通常会执行以下操作:
BIOS实际上已经是历史,下面介绍BIOS的继承者UEFI
bootloader是OS的一部分,一般认为OS=bootloader+kernel
,是第一个用户可以自定义的程序;
bootloader主要执行以下工作:
关于BIOS和Bootloader这里简单做一个区分,尽管这两个概念几乎不会混淆
Q:为什么BIOS不直接load整个OS的kernel?
A:因为BIOS只能load很小的一部分的数据(历史的包袱),并且BIOS需要保持最简化的功能(固件最简化),所以BIOS一般都是load bootloader之后进而load整个OS的kernel;
文章参考(29条消息) x86架构实模式和保护模式_liuxinux的博客-CSDN博客
X86架构是Intel较早出的CPU(8086、80286等16位以及之后的32位都属于这个架构),现在的64位CPU被称为X64(至于是AMD的还是Intel的就不要太纠结了),其他的ARM架构等不在我们的讨论范围中;
现在我们来介绍为什么会有实模式real model和保护模式protected model这两个模式;
之所以会出现这两个模式是由于历史的包袱 - 因为硬件不断演化,操作系统需要兼容,甚至硬件之间也要相互兼容,因此诞生了这两个CPU运行模式,实模式下一般只能访问16bit的数据,保护模式能够兼容16bit并访问更高位数的数据,并且保护模式能够真正的保护进程的一些信息;
保护模式又被称为虚地址保护模式,是在80286系列之后出现的一种CPU操作模式,在此之前只有实模式,为了兼容,现代计算机上电后CPU首先会在实模式下再转换为保护模式;
下面的表格简单展示了实模式和保护模式的区别
CPU实模式的内存寻址方式为分段寻址(段地址*16+段内偏移);
要注意寻址的概念不是操作系统专有(操作系统寻址最终还是对硬件进行操作),当数据存放在内存中的时候,我们称定位内存单元地址的方法为寻址,不管寻址方式如何,最终的内存中的物理地址都是一个整形的数值;
CPU保护模式脱胎于32位CPU,这意味着保护模式下CPU可以利用232的内存区域,而如今流行的64位CPU的内存空间几乎是无限大;
32位CPU除了能够寻址32位的地址以外(16位CPU可以寻址20位),还发展出了很多的功能,与现代操作系统相辅相成,例如内存保护,分页系统,以及硬件支援的 虚拟内存,拥有这么多的功能,硬件自然要提供很多机制才能实现出来,这就叫做保护模式;且保护模式下可以防止程序之间互相访问带来的问题;
因为保护模式利用了更大的内存空间,所以其寻址方式相较于实模式更加复杂,其段寄存器不再是一个单纯的段基址而是一个指向数据结构的指针;保护模式下的寻址方式主要有分段模式和分页模式;
GDT是在保护模式下一个必不可少的数据结构,同时在系统中只能是唯一的;
实模式下对内存地址的访问通过段基址:段内偏移实现,保护模式下内存的管理模式分为段模式和页模式(页模式基于段模式,也被称为段页式);
段模式下对一个段的描述包括3个因素[段基址,段最大长度,访问权限],我们将该64bit长的数据结构称为段描述符,而寄存器始终是16bit的,因此只能将这些长度为64bit的数据结构放在一个数组中,该全局可见数组就是GDT(事实上GDT不仅存了段描述符,还有其他描述符);
GDT可以存放在内存的任何位置,GDTR寄存器专门用于存放GDT的入口地址,之后CPU就可以根据该寄存器中的内容作为GDT的入口来访问GDT;
除了GDT,Intel 32位体系架构还支持构建与GDT类似的数据结构LDT(每个进程的段表实际就是LDT):
同样的,Intel 32位架构提供了LDTR寄存器来保存LDT的入口地址(全局只需要一个);
GDT表描述的是操作系统的代码段、数据段等(主要存放操作系统和各任务公用的描述符),LDT表用来描述每个进程的代码段、数据段等;
文章参考实模式:奇葩的存在 - 心渐渐失空 - 博客园 (cnblogs.com),这里主要补充介绍一下为啥现在的计算机有实模式和保护模式(前面可能介绍的比较敷衍,这里详细说一下);
作为操作系统中奇葩的存在,电脑启动时CPU在实模式,启动过程中的某个阶段会切换成保护模式;
传统的16位处理器启动时就是在实模式,也就是纯裸的,没有任何支持。32位处理器为了兼容16处理器,把开机时的实模式也兼容了,所以即使是16位的操作系统,放到32位处理器上,仍然能运行。所以开机的时候CPU就是实模式,然后32位操作系统又将实模式切换成保护模式。如果发现是16位的操作系统,就直接运行在实模式好了。实模式的存在就能兼容之前的16位程序。
CPU通常会执行两种不同性质的程序:
对操作系统而言,前者是后者的管理者,因此“管理程序”会使用一些“应用软件”不允许执行的特权指令如I/O指令、置中断指令等;
具体实现就是将CPU的状态划分为用户态和核心态,使得用户自编程序运行在用户态,操作系统内核程序运行在核心态;
一些与硬件关联比较密切的模块如时钟管理、中断处理等;其次是运行频率较高的程序如进程管理、设备管理等,这两部分内容构成了操作系统的内核 —— 这部分的指令操作工作在核心态,内核是计算机上配置的底层软件;
内核是不能直接使用的,如Linux内核,必须包装(添加C库、C编译器、绘图软件等应用软件)之后才能给用户使用;
不同的系统对内核的定义有区别,大多数操作系统内核包括:
Q:程序和软件的区别是什么?
A:简单来说,软件=程序+文档=数据结构+算法+文档
上面我们提到,操作系统引入了核心态和用户态两种工作状态,这里我们讨论这两种状态如何切换:
当用户程序需要使用一些核心态的功能时,就需要借助一些建立在核心态的“门”以便实现从用户态进入核心态,实际操作中唯一能够进入这些gate的途径就是通过中断或异常;
发生中断或异常时,运行用户态的CPU会立即进入核心态,这是通过硬件实现的(一位寄存器0表示核心态、1表示用户态)
不能被屏蔽
,一旦出现应当立即处理;中断(默认情况下所说的中断都是指外中断)处理流程大致如下:
上述流程我们在 计组期末复习笔记 - Tintoki_blog (gintoki-jpg.github.io) 有详细介绍;
操作系统在核心态应当为应用程序提供什么样的公共服务?主要有两种主要的体系结构解答:大内核和微内核;