1)提供方便的用户接口
为了规避处理具体硬件接口的复杂性,我们需要一个新的抽象层,它可以囊括所有不同的硬件组合,从而方便软件利用硬件资源。这个新的抽象层正是操作系统。
例子:文件和目录。操作系统为我们管理了磁盘上存储的数据,将一次存储在多个位置的数据结合在一起命名为一个文件,方便我们直接存取磁盘上的信息而不需要知道他们是如何被存储的。
常见的抽象层:基于进程的抽象。由于计算机的物理资源是有限的,所以计算机的程序不是连续的,因此,通常是一个程序在运行过程中被切换到另一个程序,一段时间后再继续运行。同样地,计算机的有限内存迫使一个程序的一部分内存被留在磁盘中,只有一些数据会实际存在于系统内存中。
也因此,程序设计者不需要考虑其它软件在内存中所占的大小和位置,也不需要考虑上下文切换(上下文切换即从一个进程切换到另一个进程的过程)时切换内存、保留处理器状态等复杂的过程,而只需要考虑自己所设计的程序在独占全部资源的理想状态下的运行情况。
2)防止恶意程序和含有bug的程序对计算机造成破坏
可以保证一个进程不可以直接与物理资源发生接触,以避免一个进程就可以修改磁盘上的数据,直接导致数据丢失,使得其他程序无法运行。每个进程都在抽象的内存空间中进行读写操作。
一、提供公共服务
操作系统通过抽象,向用户进程提供各种服务(如:读取、修改文件、与其他进程通信、或等待其他进程的服务),对于用户而言,他们不需要知道操作系统是如何运作,也不需要知道文件存储在磁盘哪个位置。因此操作系统可以被视为一个友好的用户接口和公共服务的提供者。
二、协调进程交互
由于,多个进程必须共享有限的物理资源,而操作系统会对多个进程起统筹规划作用,给每个进程分配适当的处理器时间、内存和其它资源。进程间的同步和通信、在进程切换过程中处理器和高速缓存器状态的变化、确保各个进程的正常运行等都属于操作系统的协调范围。
三、管理与控制资源
操作系统的一大作用是保证所有进程都可以正常运行,因此操作系统必须将有限的物理资源(处理器时间、内存、I/O 设备时间)合理地分配给不同的进程,提高资源利用率,缩短交互进程响应时间,防止进程利用其它进程的资源或恶意干扰其运行。
1、操作系统内核
与上面操作系统的功能不一样,一般的操作系统安装盘,还有别的功能,因此我们把执行操作系统的核心功能(提供公共服务、协调进程交互、构建虚拟机、管控物理资源)的部分称为 操作系统内核(kernel)。
内核无时无刻不在计算机上运行——计算机启动时第一个运行的进程就是内核,所有用户进程都基于内核运行,所有资源管控、进程交互协调都由内核完成。
2、系统空间与用户空间
处理器运算的时间分为两部分:一部分时间里,内核在处理器上运行,分配资源给用户进程,决定下一个运行的进程。另一部分时间里,用户进程在运行。
由于用户进程要通过内核获得资源,但又不能直接接触除自己以外的资源,用户进程相对于进程拥有更少的权限和资源,而且内核要和用户进程使用不同的存储空间,防止用户进程获得内核的信息。
于是将内核所用的存储空间称为系统空间,用户所有的空间称为用户空间。
3、双模式操作
我们用两种不同的模式来区分用户与内核的不同权限,这种区分被称为 双模式操作。两种模式由处理器中的一个位区分,当处理器要执行某些只允许在内核态执行的特权操作时,它会先通过这个位判断当前是否处于内核态,如果一个进程企图越权操作,处理器会触发异常,使进程被内核终止。
4、系统调用
考虑到操作系统作为公共服务提供者的角色——如果其它进程完全不能接触内核,那么它们也就无法使用内核提供的诸如读写文件、进程间通信等服务。为了在提供服务的同时确保安全,操作系统提供了一套给用户进程的服务,即系统调用,使用户进程可以在固定的位置进入系统空间,使用系统提供的服务。所有系统调用程序地址被存放在存储器某一位置,被称为系统调用表。
当然,恶意用户进程仍然可以通过使用空指针、超出缓冲区大小范围等办法对内核进行攻击,因此在设计内核时,我们必须在实现系统调用时检查用户空间指针的合理性后再将参数复制到系统空间,进行操作。
5、异常(内中断)与外中断
异常(exception) ,即内中断或同步中断,是在进程运行过程中来自处理器内部的中断信号。这些中断信号可能源于程序的非法操作(如除数为0、超长度读取数组等)、硬件故障等,而它们的中断信号将引起内核中对应的异常处理程序处理。
外中断(interrupt) 或异步中断,即来自处理器之外的中断信号。外中断包括时钟中断(即一个进程用完一定的处理器时间后,时钟会发出中断信号,使计算机进入内核态,决定下一个运行的进程)、设备 I/O 中断。这些中断信号都会引发计算机切换到内核态,处理中断信号。需要注意的是,如果同时有多个中断发生时,我们必须先处理其中一个。因此,不同中断信号有不同的优先等级,处理器会先处理优先等级高的中断,之后再处理优先等级低的中断。如果在处理一个中断的过程中,出现了另一个优先等级更高的中断信号,那么处理器可能在完成处理这个中断信号前,切换到新的中断信号处理程序,这时我们就有了多重中断。有时为了避免中断占取过多的处理器时间,我们可以在处理中断信号的过程中屏蔽某一优先等级的中断信号或某个单独的中断信号。
与系统调用类似,x86 系统将所有进入中断服务程序的地址按照一定顺序存储于存储器中某一位置,称为 中断向量表(interrupt vector) 。这一向量表控制了用户进程进入系统的地址,保护内核不被篡改。



