操作系统指令

特权指令与非特权指令

特权指令

所谓特权指令是指有特权权限的指令,由于这类指令的权限最大,如果使用不当,将导致整个系统崩溃。比如:清内存、置时钟、分配系统资源、修改虚存的段表和页表,修改用户的访问权限等。如果所有的程序都能使用这些 指令,那么你的系统一天死机n回就不足为奇了。为了保证系统安全,这类指令只能用于操作系统或其他系统软件,不直接提供给用户使用。

因此,特权执行必须在核心态执行。实际上,cpu 在核心态下可以执行指令系统的全集。形象地说,特权指令就是那些儿童不宜的东西,而非特权指令则是老少皆宜。

非特权指令

为了防止用户程序中使用特权指令,用户态下只能使用非特权指令,核心态下可以使用全部指令。当在用户态下使用特权指令时,将产生中断以阻止用户使用特权指令。所以把用户程序放在用户态下运行,而操作系统中必须使用 特权指令的那部分程序在核心态下运行,保证了计算机系统的安全可靠。从用户态转换为核心态的唯一途径是中断或异常。

特权指令分类

特权指令有以下几种:

  1. 允许和禁止中断,控制中断禁止屏蔽位

  2. 在进程间切换处理

  3. 存取用于主存保护的寄存器

  4. 执行 I/O 操作

  5. 停止一个中央处理器的工作

  6. 清理内存

  7. 设置时钟

  8. 建立存储键

  9. 加载 PSW

用户态切换内核态

用户态切换到内核态的 3 种方式:

  1. 系统调用这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如 Linux 的 int 80h 中断。

  2. 异常当 CPU 在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。

  3. 外围设备的中断当外围设备完成用户请求的操作后,会向 CPU 发出相应的中断信号,这时 CPU 会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。

系统调用和函数调用的区别

  • 系统调用本质上应该也是一种函数调用,只是调用该函数是通过中断方式,INT 指令,进入核心态才能运行。

  • 函数调用通过 CALL 指令来进行,功能和 JMP 类似,只是 JMP 用于跳转指令,而 CALL 用于调用函数,指令跳转的同时要保存函数调用前下条指令的地址,以保证函数调用完能返回当前指令接着运行。本质上都是修改 PC(程序计数器)的值,将下一条指令地址修改成相应指令地址。

  • 而系统调用是通过中断方式,即软件中断/陷入指令 INT,执行后通过硬件关中断保存断点和程序状态字形成中断服务程序入口地址,之后执行中断服务程序。看起来很像是函数调用,只是系统调用会进入核心态,执行操作系统的代码。