操作系统
操作系统(Operating System,简称 OS):控制硬件,并为其他程序提供系统调用接口。
一般认为:操作系 统是管理系统资源、控制程序执行,改善人机界面,提供各种服务,合理组织计算机工作流程和为用户使用计算机提供良好运行环境的一种系统软件。
计算机系统包括硬件和软件两个组成部分。硬件是所有软件运行的物质基础,软 件能充分发挥硬件潜能和扩充硬件功能,完成各种系统及应用任务,两者互相促进、 相辅相成、缺一不可。图 1-1 给出了一个计算机系统的软硬件层次结构。其中,每一 层具有一组功能并提供相应的接口,接口对层内掩盖了实现细节,对层外提供了使用约定。
操作系统的作用
为应用程序提供一个资源集的清晰抽象(个人理解为通过对计算机底层的抽象,为各类应用程序提供格式一致的接口),管理各种软硬件资源。
1、处理机管理
2、存储管理
3、设备管理
管理各类外围设备,完成用户提出的 I/O 请求,加快 I/O 信 息的传送速度,发挥 I/O 设备的并行性,提高 I/O 设备的利用率,以及提供每种设备的设备驱动程序和中断处理程序,为用户隐蔽硬件细节,提供方便简单的设备使用方法。
4、文件管理
5、网络与通信管理
6、用户接口
操作系统的主要特性
1、并发性
指两个或两个以上的事件或活动在同一时间间隔内发生
2、共享性(sharing)
3、异步性(asynchronism)
4、虚拟性(virtual)
处理器(CPU)
每个cpu都有一套可执行的专门指令集,所以,x86处理器不能执行ARM程序,ARM处理器也不能执行x86程序。
由于访问内存得到指令或数据的时间要比执行指令花费的实际长的多,因此,CPU内部都有一些用来保存关键变量和临时数据的寄存器
一个cpu芯片中可以有多个完整的处理器或内核
存储器
存储系统分层结构
存储器系统的顶层是CPU中的寄存器,典型的存储容量是,在32位的CPU中为32×32,64位CPU中为64×64位
计算机启动步骤
每台计算机都有一块主板,主板上有一个称为基本输出输出(BIOS basic input output system)的程序,在BIOS中,有底层I/O软件,包括读键盘,写屏幕,进行磁盘I/O以及其他过程
计算器启动时,BIOS开始运行,首先检查所安装的RAM数量,键盘和其他基本设备是否已安装并正常响应。接着,开始扫描PCIe和PCI总线,并找出连接在上面的所有设备。
然后BIOS通过尝试存储在CMOS存储器中的设备清单决定启动设备,用户可以在系统刚启动之后进入一个BIOS配置程序,对设备清单进行修改。
进程
进程是对正在运行程序的一个抽象,操作系统的其他所有内容都是围绕着进程的概念展开的,进程可以将一个独立的CPU变换为多个虚拟的CPU。
地址空间
地址空间是一个进程可用于寻址内存的一套地址集合,每个进程都有一个自己的地址空间,并将这个地址空间独立于其他进程的地址空间
虚拟内存
虚拟内存(virtual memory)的基本思想是:每个程序拥有自己的地址空间,这个空间被分隔成多个块,每一块称作一页或页面,每一页有连续的地址范围。这些也被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存的地址空间时,由硬件立刻执行必要的映射,当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令。
文件
文件是进程创建的信息逻辑单元。一个磁盘一般含有几千甚至几百万个文件,每个文件是独立于其他文件的,唯一不同的是文件对磁盘的建模,而非对RAM的建模。
死锁
如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么,该进程集合就是死锁的。
资源死锁条件
1、互斥条件。每个资源要么已经分配给了一个进程,要么就是可用的。
2、占有和等待条件。已经得到了某个资源的进程可以再请求新的资源。
3、不可抢占条件。已经分配给一个进程的资源不能再强制性地被抢占,它只能被占有它的进程显示地释放。
4、环路等待条件。死锁发生时,系统中一定有两个或两个以上的进程组成一条环路,该环路中的每个进程都在等待下一个进程所占有的资源。
死锁发生时,以上四个条件一定是会同时满足的,如果其中任何一个条件不成立,死锁就不会发生。
四种处理死锁的策略
1、忽略该问题。
2、检测死锁并恢复,让死锁发生,检测它们是否发生,一旦发生死锁,采取行动解决问题。
3、仔细对资源进行分配,动态地避免死锁。
4、通过破坏引起死锁的四个必要条件之一,防止死锁发生。
安全
漏洞
操作系统和应用程序中不乏错误,当错误涉及安全类别时,我们称之为漏洞。
当利用软件中存在的漏洞,向软件输入特定的字节来触发错误时,这种触发错误的输入通常叫做漏洞攻击或漏洞利用。成功的漏洞攻击能够使攻击者完全控制电脑,当用户任务自己是电脑上的唯一用户时,他可能并不孤单。
病毒/蠕虫
攻击者可以通过病毒或者蠕虫,手动或者自动地执行漏洞攻击。病毒和蠕虫的区别并不是非常明显,大部分人认为病毒至少需要一些用户的交互才能传播,例如,用户需要点击一个附件才可能被感染。而蠕虫不需要用户的交互和配合,他是自传播的。它们的传播和用户的行为无关,也可能是用户自愿安装了攻击者的代码。
例如:攻击者可以重打包流行但是昂贵的软件(例如游戏或者文件处理工具),并在网上免费发布。对于很多用户来说,免费是极为诱人的。然而免费安装的游戏也自动安装了而外的功能,这些功能将计算机以及上面的所有东西都交给远方的计算机犯罪,这种软件叫做特洛伊木马。
安全的三个初始属性
机密性,完整性,可用性
后续又添加了一些额外属性,例如真实性,可审计性,不可否认新,隐私性等。
主动攻击/被动攻击
被动攻击试图窃取信息。
主动攻击会使计算机程序行为异常。
linux系统层次结构
Linux启动过程
每个平台的细节不同,但是整体来说,下面的步骤代表了启动的过程。
1、当计算机启动时,BIOS加电自检(POST),并对硬件进行检测和初始化,这是因为操作系统的启动过程可能会依赖于磁盘的访问、屏幕、键盘等。
2、接下来,启动磁盘的第一个扇区,即主引导记录(MBR),被读到一个固定的内存区域并执行。这个分区中含有一个很小的程序(只有512字节),这个程序从启动设备中,比如SATA磁盘或SCSI磁盘,调入一个名为boot的独立程序,boot程序将自身复制到高地址的内存当中从而为操作系统释放低地址的内存。
3、复制完成后,boot程序读取启动设备的根目录。为了达到这个目的,boot程序必须能够理解文件系统和目录格式,这个工作通常由引导程序,如GRUB(多系统启动管理器),来完成。其他流行的引导程序,如Intel的LILO,不依赖于任何特定的文件系统,想法,它们需要一个块映射图和低层地址,它们描述了物理扇区,磁头和磁道,可以帮助找到相应的需要被加载的扇区。
4、然后,biit程序读入操作系统内核,并把控制交给内核。从这里开始boot程序完成了它的任务,系统内核开始运行。
5、内核的启动代码是用汇编语言写成的,具有较高的机器依赖性,主要的工作内容包括创建内核堆栈、识别CPU类型、计算可用内存、禁止中断、启用内存管理单元,然后掉用C语言写成的main函数开始执行操作系统的主要部分。
6、C语言代码也有相当多的初始化工作要做,但是这些工作更逻辑化(而不是物理化),C语言代码开始的时候会分配一个消息缓存区来帮助调试启动出现的问题,随着初始化工作的进行,信息被写入消息缓存区,这些信息与当前正在发生的事件相关,所以,如果出现启动失败的情况,这些信息可以通过一个特殊的诊断程序调试出来。我们可以把它当成是操作系统的“飞行信息记录器”(即空难发生后,侦测员会寻找的黑盒子)。
7、接下来,内核数据结构得到分配,大部分内核数据结构的大小是固定的,但是一少部分,如页面缓存和特殊的表结构,依赖于可用内存的大小。
8、从这里开始,系统进行自动配置,使用描述何种设备可能存在配置文件,系统开始探测哪些设备是确实存在的,如果一个被探测的设备给出了响应,这个设备就会加入到已连接的设备表中。如果它没有响应,就假设它未连接或直接忽略掉它。不同于传统的UNIX版本,linux系统的设备驱动程序不需要被静态连接至内核中,他们可以被动态加载。
9、一旦所有的硬件都配置好了,接下来要做的事情就是细心地手动运行进程0,建立它的堆栈,运行它。进程0继续进行初始化,做如下的工作;配置实时时钟,挂载根文件系统,创建ini进程(进程1)和页面守护进程(进程2)
10、init进程检测它的标志已确定它应该为单用户还是多用户服务,前一种情况,它调用fork函数创建一个shell进程,并且等待这个进程结束。后一种情况,它调用fork函数创建一个运行系统初始化的shell脚本(即/etc/rc)的进程,这个检查可以进行文件系统的一致性检测,挂载附加文件系统,开启守护进程等。然后这个进程从/etc/ttys中读取数据,其中/etc/ttys列出了所有的终端和它们的属性。对于每一个启动的终端,这个进程调用fork函数创建一个自身的副本,进行内部处理并运行一个名为getty的程序。
11、getty程序为每条连线设置传输速率和其他属性(比如,有可能是一个调制解调器),然后在终端的屏幕上输出:login: