《程序员的自我修养》第十二章读书笔记

终于快完了,倒数第二章,后面几章有些问题分析的不是非常清楚,欢迎知道的大神给小弟指点一二。

逐级向下研究运行库,就到了用户层面与内核层面的界限了,也就是常说的系统调用(System call)。系统调用是应用程序(运行库也是应用程序的一部分)与操作系统内核之间的接口,它决定了应用程序如何与内核打交道。

系统调用主要具有以下两方面的作用:

  1. 由于系统有限的资源有可能被多个不同的应用程序同时访问,因此如果不加以保护,那么各个应用程序难免产生冲突。所以现代操作系统都将可能产生冲突的系统资源给保护起来,阻止应用程序直接访问。通过以上的描述,可以发现系统调用的第一个作用就是对系统资源进行包括,应用程序想对这些资源进行访问,必须通过内核,由内核实现这部功能,并将结果返回给应用程序。
  2. 某些行为,应用程序不借助操作系统是无法办到或不能有效地办到。书中给出了让程序等待一段时间的例子。

Linux下系统调用的C语言形式被定义在/usr/include/unistd.h。

现代CPU可在多种不同的特权级下执行指令,在Linux系统中,分别使用了其特权级3与特权级0,分别对应用户模式(user mode)和内核模式(kernel mode),也即用户应用程序运行在特权级3下,内核程序运行在特权级0下。这两种模式也被分别称为用户态与内核态。由于有多种特权模式的存在,操作系统就可以让不同的代码运行在不同的模式上,以限制其权利,提高稳定性和安全性。

运行在高特权级的代码将自己降至低特权级是允许的,但反过来低特权级的代码将自己提升至高特权级则是不能轻易就进行的。因此在将低特权级的环境转为高特权级时,须要使用一种较为安全和受控的形式,以防止低特权级模式的代码破坏高特权模式代码的执行。

系统调用是运行在内核态的,用户应用程序基本都是运行在用户态的。操作系统主要通过中断的方式从用户态跳转至内核态。中断一般具有两个属性,分别是中断号与中断处理程序,不同的中断具有不同的中断号,而同时一个中断处理程序一一对应一个中断号。

通常意义上,中断有两种类型,一种称为硬件中断,这种中断来自于硬件的异常或其他事件的发生,如电源掉电、键盘被按下等。另一种称为软件中断,软件中断通常是一条指令(i386下是int),带有一个参数记录中断号,使用这条指令用户可以手动触发某个中断并执行其中断处理程序。由于中断号是很有限的,所以操作系统无法用每个中断号来对应一个系统调用,在linux下就是使用int 0x80中断来触发所有的系统调用。系统调用通过不同的系统调用号来区别不同的系统调用,进而调用不同的系统调用函数。

你可能感兴趣的:(《程序员的自我修养》第十二章读书笔记)