转载自Bakari的blog:
记录下来,作为自己的学习资料。

Linux/Unix 系统架构

Linux系统架构2

如图所示,Linux操作系统的体系架构分为用户态和内核态。用户态是指上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源,包括CPU、存储、IO等。内核则给上层应用提供了访问的接口:系统调用;对下则能够控制计算机的硬件资源。
这样设计的目的在于,隐藏了底层实现的细节,防止用户直接操作底层资源出现的各种错误,提高程序员应用开发的效率。
总的来说,用户态的应用程序可以通过三种方式来访问内核态的资源:

  1. 系统调用
  2. 库函数
  3. Shell脚本

下图是对上图的一个细分结构,从这个图上可以更进一步对内核所做的事有一个“全景式”的印象。主要表现为:向下控制硬件资源,向内管理操作系统资源:包括进程的调度和管理、内存的管理、文件系统的管理、设备驱动程序的管理以及网络资源的管理,向上则向应用程序提供系统调用的接口。从整体上来看,整个操作系统分为两层:用户态和内核态,这种分层的架构极大地提高了资源管理的可扩展性和灵活性,而且方便用户对资源的调用和集中式的管理,带来一定的安全性。

Linux系统架构2

用户态和内核态的切换

一般分为三种情况:

  1. 系统调用:程序在执行的过程中,需要通过系统调用来申请底层资源,例如malloc通过sbrk()系统调用来分配内存。
  2. 异常事件: 当CPU正在执行运行在用户态的程序时,突然发生某些预先不可知的异常事件,这个时候就会触发从当前用户态执行的进程转向内核态执行相关的异常事件,典型的如缺页异常。
  3. 外围设备的中断:当外围设备完成用户的请求操作后,会像CPU发出中断信号,此时,CPU就会暂停执行下一条即将要执行的指令,转而去执行中断信号对应的处理程序,如果先前执行的指令是在用户态下,则自然就发生从用户态到内核态的转换。

注意:系统调用的本质其实也是中断,相对于外围设备的硬中断,这种中断称为软中断,这是操作系统为用户特别开放的一种中断,如Linux int 80h中断。所以,从触发方式和效果上来看,这三种切换方式是完全一样的,都相当于是执行了一个中断响应的过程。但是从触发的对象来看,系统调用是进程主动请求切换的,而异常和硬中断则是被动的。